2012-09-02 54 views
2

如何有效地測量我的java算法的性能?有沒有準確的方法呢?測量java算法的性能

我讀過其他同類問題但不滿意。 任何幫助,將不勝感激。

+1

你想測量什麼?時間複雜性? –

+0

您可能會發現[Caliper](http://code.google.com/p/caliper/)有用。 –

+0

yea..time taken –

回答

2

您可以使用一些分析器。許多IDE(如Netbeans)都有。

+0

如何在eclipse中執行? –

+0

有一種溶劑:http://stackoverflow.com/questions/2713940/eclipse-java-profiler我沒有使用eclipse。但是測量系統時間可能會給你帶來不好的結果。根據您的過程可以暫停。您的流程需要時間。 – Achiles

+0

是的,我需要爲我的月蝕運行一個探查器。我有最新版的eclipse。 –

2

如果可以使其具有實用性或理論性。如果可行,那麼在算法開始之前放置一個計時器,並在結束時停止計時器。如果理論上使用Big O notation(並不那麼難),你會得到它的時間或空間複雜度的估計。

3
long reference=System.nanoTime(); 
your_funct(); 
long finishm=System.nanoTime(); 

System.out.println(((double)(finishm-reference))/1000000000.0); //in seconds 

在我的機器上有〜0.003秒的有意義的水平。我的意思是,你測量納秒,但最小的步驟是在我的機器大約3000000納秒。

+5

這在實踐中真的很糟糕 - 例如它不允許JIT編譯器運行。這很難做到這一點,特別是對於Java。請參閱http://www.azulsystems.com/presentations/art-of-java-benchmarking。 –

+0

如果您可以實時從控制檯打印耗時的計算序列的結果時間,您可以在真實世界中看到 –

3

你要求表現某種時機的表現。但是,你會比較什麼?

測量算法的一般方法是使用Big O,它採用簡化的數學方法。

爲了解釋這個問題,在一個非常基本的層次上,一個簡單的線性搜索整數列表有一個線性(n)最壞的情況大o。例如: for(int i = 0; i < sizeofarray; ++ i) if(array [i] == to_find) return i;

在最壞的情況下,這需要i次迭代(通常數字在大o中被稱爲n) - 所以我們稱之爲n或線性複雜度算法。

Something like a bubblesort算法是一個循環內的循環,所以我們有n * n複雜度= n^2或二次複雜度。

與like相比,如果我們只考慮排序,quicksort比二次複雜性更有效率(它是n log n複雜度),所以您可以考慮quicksort比bubblesort更好。

因此,當評估你的算法考慮它在n方面。有循環嗎?多少?越少越好。沒有更好的循環 - 恆定的大o。