[英]Why does my processing time drop when running the same function over and over again (with incremented values)?
我正在測試一種新方法來替代舊方法,並進行了一些速度測試。 現在,當我查看圖表時,每次迭代所花費的時間將大大減少。
現在我想知道為什么會這樣。 我的問題是,我的圖形卡承擔了繁重的工作,但是第一個函數迭代n次,第二個函數(藍色的)沒有一個迭代,而是“繁重”的計算工作加倍。
如果需要系統詳細信息:操作系統:Mac OS X 10.10.4核心:2.8 GHz英特爾酷睿i7(4x)GPU:AMD Radeon R9 M370X 2048 MB
如果需要兩個功能:
新的一個:
private static int sumOfI(int i) {
int factor;
float factor_ = (i + 1) / 2;
factor = (int) factor_;
return (i % 2 == 0) ? i * factor + i / 2 : i * factor;
}
舊的:
private static int sumOfIOrdinary(int j) {
int result = 0;
for (int i = 1; i <= j; i++) {
result += i;
}
return result;
}
為了澄清我的問題:為什么處理時間會急劇減少?
編輯:我至少了解一點有關成本等。 我可能對測試方法的解釋不夠好。 我有一個簡單的for循環,在此測試中,該循環從0到1000計數,並將每個值饋給1方法並記錄了花費的時間(整個循環執行),然后對其他方法進行了同樣的處理。
因此,在循環達到約500個之后,相同的方法花費的時間明顯減少。
Java沒有在圖形卡上計算任何內容(沒有其他框架或類的幫助)。 另外,對於今天的CPU,您認為“繁重”的計算也很容易(即使除法有些棘手)。 因此,速度取決於運行程序時生成的字節碼和Java優化,並且主要取決於Big-O表示法。
您的方法sumOfI
只是要執行的x條語句,所以它是O(1),無論您的i多么大,它始終僅此x條語句。 但是sumOfIOrdinary
使用一個循環,其O(n)將根據輸入使用y語句+ i語句。
因此,從理論上講,在最壞的情況下, sumOfI
總是比sumOfIOrdinary
更快。 您也可以在字節碼視圖中看到此問題。 sumOfI
只是一些load
和對cpu的add
和multiply
調用。 但是對於循環來說,字節碼也使用goto
並且需要返回到較舊的地址,並且需要再次執行行,這將花費時間。
在我的i = 500000的VM上,第一種方法需要<1毫秒,而第二種方法由於循環需要2-4毫秒。
解釋大O符號的鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.