簡體   English   中英

為什么一遍又一遍地運行相同的函數(具有遞增的值),我的處理時間會減少嗎?

[英]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的addmultiply調用。 但是對於循環來說,字節碼也使用goto並且需要返回到較舊的地址,並且需要再次執行行,這將花費時間。

在我的i = 500000的VM上,第一種方法需要<1毫秒,而第二種方法由於循環需要2-4毫秒。

解釋大O符號的鏈接:

  1. 簡單的大O符號
  2. Big O符號初學者指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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