2012-07-11 92 views
1

當測試的答案,我related questions之一,我寫了這個:爲什麼要添加一行計算減少運行時間?

public static long timeDouble(int iters) { 
    long start = System.currentTimeMillis(); 
    for (; iters >=0; iters--) { 
     double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772; 
     a = Math.sqrt(a); 
     b = Math.cos(b); 
     c = Math.sin(c); 
     d = Math.tan(d); 
     e = a + b - c * d/(e + 1); 
     e = Math.pow(e, e); 
    } 
    return System.currentTimeMillis() - start; 
} 

這種方法的運行時間爲414ms的平均(使用百萬次迭代)。然而,有些東西附身我加入這行:

e = e + d - c * b/(a + 1); 

之前e = Math.pow(e, e);在加入這一行的,爲了計算這種方法的時候下降到平均206毫秒(使用相同的測試條件下)。

這是什麼造成的?

+1

也許'e'的值被這個等式減少了,然後'Math.pow(e,e)'將花費更少的時間來執行。 – 2012-07-11 16:24:45

+3

這可能是由於Math.pow(e,e)使用較少的處理器週期這一事實,也許是由於e較小的事實。 – 2012-07-11 16:25:16

+2

上面的海報可能是正確的,但我通常會偏離這種微基準,它有很多缺陷。 http://www.kdgregory.com/index.php?page=java.microBenchmark – Thor84no 2012-07-11 16:29:12

回答

3

循環中的值是常量,它們不取決於iters。因此這些值始終保持一致。

double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772; 
    a = Math.sqrt(a); 
    b = Math.cos(b); 
    c = Math.sin(c); 
    d = Math.tan(d); 
    e = a + b - c * d/(e + 1); 
    e = Math.pow(e, e); 

在第一個版本你計算e是價值17.969772^17.969772。在第二個你計算e是值0.69761863561124537^0.69761863561124537。這是(通過你自己的證據)更容易計算機。