我在核心java中开发了一个图像处理算法(不使用任何第三方API),现在我必须计算该算法的执行时间,为此我使用了 System.currentTimeMillis()那样,
public class MyAlgo {
public MyAlgo(String imagePath){
long stTime = System.currentTimeMillis();
// ..........................
// My Algorithm
// ..........................
long endTime = System.currentTimeMillis();
System.out.println("Time ==> " + (endTime - stTime));
}
public static void main(String args[]){
new MyAlgo("d:\\myImage.bmp");
}
}
但问题是每次我运行这个程序时,我都会得到不同的执行时间。任何人都可以建议我,我该怎么做?
答案 0 :(得分:2)
单独一次执行就无法获得可靠的结果; Java(以及JVM)执行运行时优化,还有其他进程竞争CPU时间/资源访问。此外,您确定您的算法在任何输入的情况下都能以恒定时间运行吗?
让计算尽可能可靠的最佳选择是使用专用于性能测量的库;其中一个是caliper。
设置具有不同输入/输出等的基准并运行它。
答案 1 :(得分:2)
如果您不想使用外部分析库,只需将算法包装在执行1000次的for()循环中,并将总时间除以1000.结果将更准确,因为所有其他任务/流程甚至会消失。
注意:总体测量时间将反映算法完成的预期时间,而不是算法编码指令所需的总时间。 例如,如果您的算法使用大量内存,并且平均每次执行算法时,Java VM都会调用两次垃圾收集器 - 而您应该同时考虑垃圾收集器的时间。 这正是for()循环所做的,所以你会得到很好的结果。
答案 2 :(得分:0)
您需要对算法的多次执行应用一些统计分析。例如,执行1000次并分析最小,最大和平均时间。
在不同场景中的多次执行也可能提供见解,例如,在不同的硬件或具有不同分辨率的图像。
我认为您的算法可以分为多个步骤。您可以单独监控这些步骤,以了解每个步骤的影响。
例如,Marvin Image Processing Framework提供了监视和分析每个算法步骤的执行时间和执行次数的方法。