2013-01-24 66 views
3

我在java中有兩種方法(例如因子計算),我必須測試這兩種方法來找出哪一種更快。我的代碼爲遞歸和循環:如何比較Java中的2方法?

它們都在相同的Class數據中。

public long FakultaetRekursiv(int n){ 
     if(n == 1){ 
     return 1; 
     } 
     else{ 
     return FakultaetRekursiv(n-1) * n; 
     } 
    } 


    public long Fakultaet(int n){ 
     int x=1; 
     for(int i=1; i<=n; i++){ 
      x= x*i; 
     } 
     return x;  
    } 

我聽說currentTimeMillis()可以幫助一點,但我不知道如何做到完全。 謝謝。

+1

您應該通過在數組中存儲所有可能值的數組中查找結果來實現它。這非常確定* Fakultaet *的最快實施。 – MrSmith42

+1

這些方法都不會運行足夠長的時間來進行優化或重要。 –

+1

你應該改變你的遞歸實現來檢查'n == 0'而不是'n == 1',因爲* 0! == 1 *的定義。也許拋出一個例外負n值。 – MrSmith42

回答

3

總是走的基礎!只是用它來發現的功能

long startTime = System.nanoTime(); 
methodToTime(); 
long endTime = System.nanoTime(); 

long duration = endTime - startTime; 
+0

如果我嘗試修改與我的代碼,我得到一個「無法訪問的聲明」編譯器錯誤。我如何修改? – altank52

3
long start = System.currentTimeMillis(); 

//你的代碼在這裏

System.out.println(System.currentTimeMillis() - start + "ms"); 
+0

好吧,當我想用​​你的解決方案修改我的代碼。我遇到了編譯錯誤(無法訪問的聲明)。所以我又做了另一類'public long getLastRuntime(){ \t \t \t long start = System。的currentTimeMillis(); \t \t return start; \t \t} '我改變了我的新代碼,以便公衆'長FakultaetRekursiv(INT N){ \t \t \t如果(N == 1){ \t \t回1; \t \t \t} \t \t否則{ \t \t返回FakultaetRekursiv第(n-1)* N; \t \t \t} \t \t \t的System.out.println(System.currentTimeMillis的() - getLastRuntime()+ 「MS」); \t \t}' – altank52

+0

@ altank52也許你在'return'聲明後粘貼。請在代碼 – isvforall

+0

@ altank52上粘貼'System.out.println(System.currentTimeMillis() - getLastRuntime()+「ms」);'return'之前 – isvforall

8

Micro-benchmarking is hard採取每個時間,使用正確的工具,例如Caliper。這裏是會爲你工作的例子:

import com.google.caliper.SimpleBenchmark; 

public class Benchmark extends SimpleBenchmark { 

    @Param({"1", "10", "100"}) private int arg; 

    public void timeFakultaet(int reps) { 
     for (int i = 0; i < reps; ++i) { 
      Fakultaet(arg); 
     } 
    } 

    public void timeFakultaetRekursiv(int reps) { 
     for (int i = 0; i < reps; ++i) { 
      FakultaetRekursiv(arg); 
     } 
    } 

} 

框架將啓動巡航time*()方法很多次,而且它會注入不同arg值,並分別bechmark他們。

+1

確保您不會忽略測試方法的結果。一旦我遇到了整個方法在優化時被刪除的情況,因爲結果從未在測試循環中使用過。 – MrSmith42

+0

@ MrSmith42:+1。卡尺文檔中描述了此問題,卡尺甚至試圖發現它。我想保持簡短的例子。 –

+0

非常感謝你的評論傢伙。我從你身上學到了很多東西。但是,我應該使用currentTimeMillis()來比較循環或遞歸方式工作得更快。有任何想法嗎 ? – altank52

-1

還可以通過手做到這一點:

第一種方法可以與F(x) = F(x-1) * x遞歸關係,其生成圖案進行說明...

F(x) = F(x-1) * x 
= F(x-2)*x*(x-1) 
= F(x-3)*x*(x-1)*(x-2) 
. . . 
= k*n 

其爲O(n)。

顯然,第二種方法也可以用O(n)來描述,這意味着它們處於相同的上界。但是在實現定時解決方案之前,這可以用作快速檢查。

+0

@ MrSmith42編輯:你是對的! - 我搞砸了我的大O符號。 – sdasdadas