2

我的問題是:(即,不分析,讀取/寫入到HDD上,而不是一個子例程等文件)有沒有辦法預測(或測量)執行一行代碼需要多長時間?

鑑於分離的一行代碼,是有可能預測或以任何程度的準確性和/或一致性來衡量代碼在特定系統上執行多長時間?

例如,假設我有以下代碼(不以任何特定的語言,只是一個概括):

1 | If x = 1 then 
2 | x = x + 1 
3 | End If 

將需要多長時間來執行第2行?

這裏尋找數字;我只是想知道這樣的事情是可能的還是實際的。

謝謝!

更新:

現在我正在尋找一些數字......如果我要執行一個簡單的For循環,根本睡每次迭代1秒,60(實際)分鐘後,關會是多遠?換句話說,評估一行隔離代碼的時間可以忽略不計(假設沒有錯誤或中斷)?

+1

如果你正在尋找數字,不要看這裏。建立一個實驗並收集一些數據。 – 2012-07-06 10:29:32

回答

3

如果你看一下文件,如this你會發現基本操作多少個時鐘週期需要在CPU上,而這些時鐘週期是多長時間。將這些數字轉化爲在程序中執行x = x+1所花費的時間是一種不準確的科學,但是通過檢查編譯器生成的彙編代碼列表,您會得到某種線索。

隨着您從簡單的算術語句轉向大型程序,您開始遇到由於現代CPU和現代操作系統以及內存層次結構等等的複雜性而引發的各種問題,科學的精確程度越來越低。

+1

嗯我懷疑這對現代CPU的任何程度的作品。最明顯的例子是:所有依賴於對方的100條指令比300條獨立指令慢得多(儘管英特爾在預測方面越來越好,因此編寫第一個代碼可能不再那麼容易)。 – Voo 2012-07-06 11:33:58

+0

+1我曾經看到學者們對事情需要多長時間缺乏可預測性感到遺憾,但流水線和緩存的全部要點是機會主義,並且在不可預測的機會出現時節省週期,因此支付性能的代價就變成了隨機遊戲。 – 2012-07-06 13:08:35

1

最簡單的方法是運行十億次,查看花了多少時間,然後除以十億。這應該消除時鐘精度的問題。

+0

是的,reeeeaaaal簡單; P – Matt 2012-07-06 10:32:14

1

聽起來像是你可能有興趣瞭解Big O Notation。使用Big O,您可以瞭解如何編寫最高效的算法,而不管運行機器的速度如何。

大多數電腦通常都會有一些流程,服務或其他「工作」在後臺運行,並在不同的時間以各種理由......這往往會使其很難預測確切的執行時間消耗資源。但是,如果你可以將上面的代碼分解爲彙編語言並計算在機器級使用的位數,寄存器和時鐘滴答數,我會假設可以得到準確的估計。

1

答案是一個響亮的號碼。例如,考慮如果在加法過程中產生了一箇中斷會發生什麼情況:在中斷已經被服務之後,將執行下一個指令,因此給人的印象是加法花費了很多時間。

如果我們談論的是一個ISR禁用條件,那麼答案是「這取決於」。例如,考慮在if上分支預測失誤可能會大大減慢執行速度。關於多核CPU也是如此(通常一些ALU是在內核之間共享的,因此內核上的活動可能會影響其他內核上的操作性能)。

如果我們談論的是一個單核和單級流水線CPU上的ISR禁用條件,那麼我想你應該能夠預測它需要多長時間。問題是,你可能正在研究微控制器(還有一個老的)。 :)

更新:第二個想法,甚至在最後一種情況下,您可能無法準確預測它:實際上,某些操作是數據相關的(規範示例是對非正規數的浮點運算)。

相關問題