0

我在核心 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");
   }
}

但问题是每次我运行这个程序时,我都会得到不同的执行时间。谁能建议我,我该怎么做?

4

3 回答 3

2

您无法仅从一次执行中获得可靠的结果;Java(嗯,JVM)进行运行时优化,此外还有其他进程竞争 CPU 时间/资源访问。另外,您确定无论输入如何,您的算法都会在恒定时间内运行吗?

要使计算尽可能可靠,最好的办法是使用专门用于性能测量的库;其中之一是卡尺

设置具有不同输入/输出等的基准并运行它。

于 2013-07-11T04:50:04.303 回答
2

如果您不想使用外部分析库,只需将您的算法包装在一个 for() 循环中,该循环执行 1000 次并将总时间除以 1000。结果将更加准确,因为所有其他任务/进程甚至会出去。

注意:总体测量时间将反映算法完成的预期时间,而不是算法代码指令所需的总时间。例如,如果您的算法使用大量内存,并且平均每次执行算法时 java VM 调用垃圾收集器两次 - 那么您还应该考虑垃圾收集器的时间。这正是 for() 循环所做的,所以你会得到很好的结果。

于 2013-07-11T06:48:19.917 回答
0

您需要对算法的多次执行应用一些统计分析。例如,执行 1000 次并分析最小、最大和平均时间。

不同场景中的多次执行也可能提供洞察力,例如,在不同的硬件中或具有不同分辨率的图像。

我想您的算法可以分为多个步骤。您可以独立监控这些步骤以了解每个步骤的影响。

例如, Marvin Image Processing Framework提供了监控和分析每个算法步骤的时间和执行次数的方法。

于 2013-07-18T13:34:30.967 回答