[英]Why does my Assembly code run in linear time when it should run in O(N*sqrt(N)) time?
因此,我正在匯編中編寫素數生成器(以學習語言),並且當我開始對程序進行基准測試時,我發現它在線性時間而不是預期的O(N * sqrt(N))
時間中運行。
為什么會這樣呢?
我仔細檢查了代碼,並將其放在這里的github上: https : //github.com/kcolford/assembly_primes 。 它應該是相當可讀的,但是如果有人想讓我對其進行更徹底的注釋(就像對每條指令的解釋一樣),我很樂意這樣做,只是我認為沒有必要。
我使用的匯編器和鏈接器是在GNU binutils中找到的,並且是為運行Linux內核的x86_64體系結構編寫的。
大O復雜度很難通過實驗來衡量。 就像Phil Perry所建議的那樣,經常有線性項(或其他項)使“小”運行的主要O ()項不堪重負。 這些多余的術語(用big-O表示法隱藏)始終存在於實際代碼中,在分析某些對象的實際運行時時必不可少。
當我在測試機上測量示例代碼時,我得到了明顯的非線性關系。 由於信譽不佳,我無法發布劇情,但這里有一張桌子:
N (= n^2) Time
1000000 0.386
4000000 1.846
9000000 4.673
16000000 9.275
25000000 15.850
36000000 24.690
49000000 35.850
64000000 49.887
81000000 66.509
100000000 86.855
另外,我也沒有仔細研究算法的確切實現方式,但是Eratosthenes的篩網是O( n log log n ),而不是O( n sqrt( n ))。
還要注意,與數字處理相比,I / O通常非常昂貴。 在您的情況下,在我的測試機上, n = 5000,I / O幾乎占總運行時間的30%。 這將是運行時分析中的重要線性項。 您必須徹底分析代碼所做的所有其他事情,以找出影響測量的其他因素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.