1. 程式人生 > >[珠璣之櫝]估算的應用與Little定律

[珠璣之櫝]估算的應用與Little定律

  估算的資料主要依賴於所能獲得的資料和常識,有時還包括實踐而不僅僅是理論。它常常作為一個大問題中的子問題,恰當地估算可以省去精確計算的時間和開銷。在計算機領域,所謂常識的內容很寬泛,比如硬碟的傳輸速度、CPU每秒能執行多少指令、各種資料結構的大小甚至每分鐘錄入的單詞數。有些資料是能夠從各種資料中查得的,但僅僅靠記憶總難免遺漏;如果有經過學習而建立起的系統的知識結構,那便能很方便地把這些常識組織起來,除此以外,還可以靠平時經驗的積累和一些面試題上的啟發了。這裡將進行一個收集,隨時更新。

  Little定律深入了估算所依賴的法則的細節:總花費等於各個部分的花費再乘以總的部分數,它在計算機系統方面的一些計算中十分有用。

  計算機方面的估算問題:

  1.硬碟檔案讀寫速度的小問題:是否能超過10MB/s?(筆者某次面試中被問到的的一個關於伺服器的問題的子問題)

  分析:根據以往拷貝檔案的經驗,對於不是多個零散小檔案的情況,讀寫速度比這個值要快得多,因此做出了肯定的答案。

  2.確定一個空迴圈for(i=0;i<n;i++)在一秒鐘執行的次數n,使其為CPU在1秒鐘內執行總指令數目的一半(《程式設計之美》第一章的子問題)

分析:先把空迴圈化為彙編指令:

loop:
mov dx i
inc dx
mov i dx
cmp i n
jl loop

一共5條指令,假設使用的CPU是單核2.4GHz即每秒2.4G個時鐘週期,(常識)現代CPU每個時鐘週期執行兩條以上的程式碼,那麼一秒鐘可以執行空迴圈(2 400 000 000 *2)/5 = 960 000 000次。

(為了提高精度而進行降低數量級的優化不再討論)

  3.struct node {int i; struct node *p}是否可以將這樣的2 000 000個結點裝入128MB記憶體的計算機中?(《程式設計珠璣》7.2效能估計)

分析:為了簡化討論,假定在32位機上int和指標都是32位的,共用了8B,直接計算的結果是隻需16MB空間,而《程式設計珠璣》作者的128MB的計算機通常有85MB空閒,看上去是夠用的。然而使用malloc()為結點分配空間時會額外佔用空間(原因:malloc的機制,Linux的malloc()有一個每次分配的最小大小,小於這個值也會分配這麼多;struct的對齊),這個值在作者計算機上是40B,導致了一共佔用了96MB空間,事實上是不夠用的。

  4.運算的實際消耗時間:使用for(i=0;i<n;i++) fa =sqrt(10.0);計算單次sqrt()的執行時間是否準確?(《程式設計珠璣》7.2效能估計)

實際的單次運算時間可能慢得多,因為sqrt()可能儲存了最近引數作為起始值。

  (更多待補充……)

  估算常用法則:

1.“72法則”:以年利率r%進行投資y年,如果r * y = 72,那麼投資差不多會翻倍。

如果以t = (1+r/100)y,並把r代換成72/y,即t = (1+72/(100y))y,進行作圖,會發現這一段t的值都在2附近,符合這條法則。

應用:假設一個指數程式解決n=40的問題需要10s,且n每增加1執行時間就增加12%,那麼根據72法則,n每增加6,執行時間就加倍。進一步地,n每增加60,執行時間就為原來的1000倍(210的近似數)。

2.(記憶常識)π秒是一個納世紀。

注:一年有3.155 * 107秒,而π取3.14、納世紀為100年 * 10-9 ,這時兩者的積與這個值近似。

3.Little定律:佇列中物體的平均數量為進入速率與平均停留時間的乘積。

注:顯而易見的法則是,總開銷等於每個開銷乘以單元的個數;而Litte定律描述的是一個動態系統。如果想了解定律的證明,需要隨機過程與排隊論的相關知識。

應用:多使用者系統的響應時間公式,思考時間z的n個使用者登入到響應時間r的系統,每個使用者週期都為使用者的思考和系統響應,即z+r;作業總數為n,那麼對一個時間點來看,平均負荷為n、平均響應時間為z+r,吞吐量為x(每個時間單位處理的作業數),根據Little定律,n = x*(z+r),這樣就可以求解r = n/x -z。

例1:(程式設計珠璣(續),7.4節)一個計算機系統,包括磁碟、處理器、作業系統和20個思考時間為20秒的終端,通過觀察,它的磁碟每處理一個作業就要處理100個數據請求,而磁碟每秒鐘可以處理25個請求。那麼系統的吞吐量和響應時間各為多少?

解答:吞吐量直接計算,為25/100=0.25個作業/秒,響應時間r = 20/0.25 -20 = 60秒。這在流平衡下就是精確解。

例2:(程式設計珠璣(續),習題7.8)假設一個作業在某機器上執行時間是20秒,該機器一次可能同時執行10個作業,而你的作業是100等待執行的作業中的最後一個,作業以先進先出方式執行。大概需要等多久才能等到作業執行結束?

解答:這裡要考慮兩個排隊系統:待執行任務佇列和計算機系統本身。根據Little定律,第二個系統任務輸出率X=L/R,L=10個任務,R=20秒,因此X=0.5個任務/秒。這也是第二個系統的任務到達率。因此最後一個任務會在前99個任務在198秒後完成時進入,再加上20秒的執行時間,總的時間是218秒。

往期回顧:

相關推薦

[珠璣]估算應用Little定律

  估算的資料主要依賴於所能獲得的資料和常識,有時還包括實踐而不僅僅是理論。它常常作為一個大問題中的子問題,恰當地估算可以省去精確計算的時間和開銷。在計算機領域,所謂常識的內容很寬泛,比如硬碟的傳輸速度、CPU每秒能執行多少指令、各種資料結構的大小甚至每分鐘錄入的單詞數。有些資料是能夠從各種資料中查得的,但僅

珠璣”系列簡介索引

系列博文主要目的:   收集《程式設計珠璣》和《程式設計珠璣(續)》(以下簡稱《續》)上的演算法和思想,幷包括了一些自己的思考和對相關問題的引申,以備複習和查用。 內容提要:   主要是演算法收集,結合了《程式設計實踐》 (Practise of Programming)、《程式設計精粹:編寫高質量C語

[珠璣]二分思想分治法、排序思想

#include <stdio.h> #include <assert.h> int BitCheck(int total,int n,int last) { FILE *input,*output0,*output1; char filename[10

[珠璣]隨機數函式取樣概率

  本節主要受到《程式設計珠璣》第12章隨機取樣問題的啟發,但不僅僅限於隨機取樣問題,進一步地,研究討論了一些在筆試面試中常見的和隨機函式以及概率相關的問題。   閱讀本文所需的知識:     1.對C語言中或其他語言中等價的rand()、srand()有所瞭解。本文不討論種子的設定和偽隨機數的問題;

[珠璣]位向量/點陣圖的定義和應用

  位向量/點陣圖是一個很有用的資料結構,在充分利用小空間儲存大量資料方面非常具有優勢,Linux核心中很多地方都是用了點陣圖。同時,它不但基礎,而且用到了很多程式語言的知識,以及對細節的把握,常常作為面試題出現。這裡將要介紹它的實現、操作、應用。   與點陣圖(bitmap)比,我更傾向於用位向量(bit

[珠璣]字串和序列:左移、雜湊、最長重複子序列的字尾陣列解法、最大連續子序列

  字串和陣列在儲存上是類似的,把它們歸為同一主題之下。本文主要介紹三大類問題和它們衍生的問題,以及相應演算法。   本文主要介紹和討論的問題和介紹的演算法(點選跳轉): 字串迴圈移位(左旋轉)問題 問題敘述:   將一個n元一維向量向左旋轉i個位置。例如,當n=8且i=3時,"abcde

[珠璣]淺談程式碼正確性:迴圈不變式、斷言、debug

  這個主題和程式碼的實際寫作有關,而且內容和用法相互交織,以下只是對於其內容的一個劃分。《程式設計珠璣》上只用了兩個章節20頁左右的篇幅介紹,如果希望能獲得更多的例項和技巧,我比較推崇《程式設計實踐》 (Practise of Programming)、《程式設計精粹:編寫高質量C語言程式碼》(Writin

資料探勘KMeans演算法應用簡單理解

一、背景 煤礦地磅產生了一系列資料:   我想從這些資料中,取出最能反映當前車輛重量的資料(有很多資料是車輛上磅過程中產生的資料)。我於是想到了聚類演算法KMeans,該演算法思想比較簡單。 二、演算法步驟 1、從樣本中隨機取出k個值,作為初始中心 2、以k箇中心劃分這些資料,分為k

《程式設計珠璣》程式碼路10:little定律,一個和生活息息相關的結論

今天,同學聚會,喝了十瓶啤酒,死皮賴臉的要了一個哥們的電腦,保證自己不會吐上邊哈哈。 哈哈,好啦,進入正題: Little定律:系統中物體的平均數量等於物體離開系統的平均速率和物體在系統中平均停留時間的乘積。 和大部分定律一樣,乍眼看去,一點用沒有。 現在給出下面一個場景:一個可以容

linux應用vim的安裝配置(centos)

utf8 power scroll pbo gb2312 nco pla red vma 1.vim的安裝 #yum search vim //查看vim相關軟件信息 #yum install -y vim* //在線安裝vim 2.vim的配置 (1)~/.vimi

OSPF的高級應用地址匯總虛鏈路的配置

路由協議 ospf協議 虛鏈路 楊書凡 地址匯總 在大型網絡中,要使路由器發揮最好的性能,需要做一些優化。而由於一些原因,造成了OSPF區域骨幹區域沒有和非骨幹區域相連、骨幹區域不連續等問題。如要更改區域所有路由器配置,工作量較大,這時可使用虛鏈路連接沒有連接在一起的區域,還有助於

大數據項目實戰Python金融應用編程(數據分析、定價量化投資)

python金融大數據項目實戰之Python金融應用編程(數據分析、定價與量化投資)分享網盤地址:https://pan.baidu.com/s/1bpyGttl 密碼: bt56內容簡介本教程介紹使用Python進行數據分析和金融應用開發的基礎知識。課程從介紹簡單的金融應用開始,帶領學員回顧Python的基

Huffman的應用文件壓縮解壓縮

讀取文件 size 父節點 .get 位移 etc RM 初始 amp 文件壓縮與解壓縮> ???? 近期這段時間一直在學習樹的這樣的數據結構,也接觸到了Hu

[Windows10]記一次修復註冊表相關血案:該文件沒有關聯的應用來執行該操作。請安裝應用,若已經安裝應用,請在“默認應用設置”頁面中創建關聯。

src 相關 overflow 還在 一次 註冊表 forum sin 嘗試 今天閑得蛋疼清理了一下右鍵菜單,於是在之後某時刻使用Everything的“雙擊路徑列打開目錄”功能時發現異常: [Window Title] Everything

Java基礎知識回顧static應用總結

相關關鍵字的說明: this關鍵字 final關鍵字 static關鍵字修飾屬性 static關鍵字修飾方法 static關鍵字應用與總結 前面兩篇分別介紹了static的屬性以及方法。本篇就做一個收尾,介紹下剩下的。 在之前的總結: 不管多少個物件,都使用同一個 s

嵌入式基礎應用開發佇列的開發使用(蘇嵌日誌Wednesday)

學習日誌 姓名:沈壯壯 1.今日學習任務 佇列的順序儲存及鏈式儲存 2.今日任務完成情況 回顧了昨天的棧式結構:先進後出,由此引出佇列:先進先出。 隊頭(front):取出資料 隊尾(rear):存放資料(順序儲

zookeeper應用實現

Leader Elections(leader選舉) 指派一個程序作為組織者,將任務分發給各節點。在任務開始前,哪個節點都不知道誰是leader(領導者)或者coordinator(協調者)。當選舉演算法開始執行後,每個節點最終會得到一個唯一的節點作為任務l

PythonFlask框架應用(三)_BoortstrapFlask_wtf

#######Flask框架####### ## flask-bootstrap # 如何在flask中使用Bootstrap         要想在程式中整合Bootstrap,顯然要對模板做所有必要的改動。不過,更簡單的方法是使用一個名為Flask-

《資料結構演算法》棧的應用

1、字串的翻轉(逆序) 根據棧“後進先出”的特點,可以利用棧對字串進行反轉,即實現字串的逆序。 藉助於《資料結構與演算法》之棧(2)中的棧結構,相應實現的程式碼如下: public static void ReverString() { BigStack stac

二十五、併發程式設計join應用實現原理剖析

1、join有什麼用呢? 當一個執行緒正在進行中的時候,如果我們想呼叫另外一個執行緒的話,這時我們可以使用join。 2、join方法的底層原理,簡單來說就是,join方法能把所呼叫join方法的執行緒進入休眠狀態(wait()),等執行完joinThread執行緒之後,會自動