如何有效地衡量我的 java 算法的性能?有什么准确的方法吗?
我读了其他同类但不满意的问题。任何帮助,将不胜感激。
long reference=System.nanoTime();
your_funct();
long finishm=System.nanoTime();
System.out.println( ( (double)(finishm-reference) )/1000000000.0); //in seconds
在我的机器中具有约 0.003 秒的有意义的水平。我的意思是,您以纳秒为单位进行测量,但在我的机器中,最小的步长约为 3000000 纳秒。
您要求性能表明某种时间。但那你会和什么比较呢?
衡量算法的一般方法是使用 Big O,它采用简化的数学方法。
为了在非常基本的层面上解释这一点,整数列表的简单线性搜索具有线性 (n) 最坏情况大 o。例如: for(int i = 0; i < sizeofarray; ++i) if(array[i] == to_find) return i;
在最坏的情况下,这将需要 i 次迭代(通常在大 o 中将数字称为 n) - 所以我们称之为 n 或线性复杂度算法。
类似于冒泡排序算法的东西是循环中的循环,因此我们有 n * n 复杂度 = n^2 或二次复杂度。
与 like 相比,如果我们只考虑排序,快速排序比二次复杂度(它是 n log n 复杂度)更有效,因此您可以认为快速排序比冒泡排序“更好”。
So when evaluating your algorithm think about it in terms of n. Is there a loop? how many? The fewer the better. No loops even better - constant big o.
如果可以使其实用或理论。如果可行,则在算法开始之前放置一个计时器,并在算法结束时停止它。如果是理论上的,那么使用Big O 表示法(不是那么难),您将获得对其时间或空间复杂度的估计。
您可以使用一些分析器。许多 IDE(例如 Netbeans)都有一个。
The best way to do it is still java.lang.System.currentTimeMillis() as it will work regardless the IDE you are using.