如何衡量用Java编写的代码的速度?(人工智能算法)

如何衡量用Java编写的代码的速度?

我计划开发软件,使用所有目前可用的AI和ML算法解决数独问题,并将时间与简单的蛮力方法进行比较。我需要测量每种算法的时间,我想征求有关最佳方法的建议?非常重要的一点是,无论CPU功率/内存如何,程序必须在任何计算机上都很有用。

谢谢。


答案 1

正如其他人所建议的那样,这是相当不错的,但请注意以下注意事项:System.currentTimeMillis()

  • System.currentTimeMillis()测量已用的物理时间(“挂钟时间”),而不是 CPU 时间。如果计算机上正在运行其他应用程序,则您的代码将获得较少的 CPU,并且其速度将降低。因此,仅在其他空闲系统上工作台。
  • 同样,多核系统上的多线程应用程序可能会获得额外的隐藏 CPU。经过的时间度量值并不能捕获多线程应用程序的全部复杂性。
  • Java需要一点“热身”。VM 将首先解释代码(这很慢),如果给定方法使用次数过多,则 JIT 编译器会将该方法转换为本机代码。只有到那时,该方法才能达到其最高速度。我建议您在调用 之前执行一些“空循环”。System.currentTimeMillis()
  • 的精度很少为 1 ms。在许多系统上,精度不优于10 ms,甚至更高。此外,JVM有时会运行GC,从而引起明显的暂停。我建议你把你的测量组织成一个循环,并坚持至少运行几秒钟。System.currentTimeMillis()

这将生成以下代码:

for (int i = 0; i < 10; i ++) {
    runMethod();
}
int count = 10;
for (;;) {
    long begin = System.currentTimeMillis();
    for (int i = 0; i < count; i ++)
        runMethod();
    long end = System.currentTimeMillis();
    if ((end - begin) < 10000) {
        count *= 2;
        continue;
    }
    reportElapsedTime((double)(end - begin) / count);
}

如您所见,有前十个“空”运行。然后,程序在循环中运行该方法,根据需要多次运行,以便循环至少需要十秒钟。十秒钟应该足以消除GC运行和其他系统不准确之处。当我对哈希函数实现进行基准测试时,我使用两秒钟,即使函数本身根本没有触发内存分配,我仍然会得到高达3%的变化。


答案 2

我通常使用

System.currentTimeMillis()

计算时间增量:

long start = System.currentTimeMillis();
/* do your algorithm iteration */
long elapsed = System.currentTimeMillis() - start;

请注意,根据您使用的操作系统,函数的精度可能大于1毫秒(也是十分之一毫秒),因此您必须对其进行调整以用于分析。

编辑:还有做同样的事情的替代方案,但你不能保证精度是纳秒。System.nanoTime()


推荐