簡體   English   中英

為什么我的匯編代碼應在O(N * sqrt(N))時間中運行,卻以線性時間運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM