Java算法性能测量

3

如何有效地衡量我的Java算法的性能?有没有准确的方法来做到这一点?

我看了其他类似问题的答案,但并不满意。感谢任何帮助。


1
你想要测量什么?时间复杂度吗? - Adam Sznajder
你可能会发现Caliper很有用。 - Alan Stokes
我有 Eclipse... 通过代码也没问题。 - Chhaya Vishwakarma
5个回答

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。 - Alan Stokes
如果您可以实时从控制台打印非常耗费计算序列的结果时间,那么您就可以在现实世界中看到它。 - huseyin tugrul buyukisik

3
你要求性能,这意味着某种形式的时间测量。但你会与什么进行比较呢?
衡量算法的一般方法是使用大O符号,它采用了简化的数学方法。
简单线性搜索整数列表的最坏情况下的大O符号为线性(n)。例如: for(int i = 0; i < sizeofarray; ++i) if(array[i] == to_find) return i;
在最坏情况下,这将需要i次迭代(通常将数字称为大O符号中的n),因此我们将其称为n或线性复杂度算法。
像冒泡排序算法这样的东西是一个循环内嵌套另一个循环,所以我们有n * n复杂度=n²或二次复杂度。
如果只考虑排序,那么与冒泡排序相比,快速排序更有效率(它是n log n复杂度),因此可以认为快速排序比冒泡排序“更好”。
因此,在评估算法时,请考虑它的n。有循环吗?循环次数多少?循环次数越少越好。没有循环则更好——常数大O符号。

2

如果是实际的话,可以在算法开始之前设置一个计时器,并在结束时停止它。如果是理论的话,使用大O符号(并不难),你将得到其时间或空间复杂度的估计。


2

您可以使用一些性能分析工具。许多集成开发环境(例如Netbeans)都有这样的工具。


有一个解决方案:http://stackoverflow.com/questions/2713940/eclipse-java-profiler 我没有使用eclipse。但是测量系统时间可能会给你错误的结果,因为你的进程可能会被暂停。你需要知道你的进程所用的时间。 - Achiles
是的,我也需要在我的 Eclipse 上运行分析器。我有最新版本的 Eclipse。 - huseyin tugrul buyukisik

0

最好的方法仍然是使用java.lang.System.currentTimeMillis(),因为它可以在任何你使用的IDE中工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接