首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何测量用Java编写的代码的速度?(AI算法)

如何测量用Java编写的代码的速度?(AI算法)
EN

Stack Overflow用户
提问于 2010-03-09 03:05:22
回答 5查看 6.6K关注 0票数 17

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

我计划开发软件,使用目前所有可用的AI和ML算法来解决数独问题,并将时间与简单的蛮力方法进行比较。我需要测量每个算法的时间,我想请教一下做这件事的最佳方法是什么?非常重要的是,程序必须在任何机器上都是有用的,无论CPU功率/内存如何。

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-09 04:11:17

正如其他人建议的那样,System.currentTimeMillis()非常好,但请注意以下注意事项:

  • System.currentTimeMillis()测量的是物理时间(“挂钟时间”),而不是CPU时间。如果机器上正在运行其他应用程序,您的代码将获得较少的CPU,并且其速度将会降低。因此,多核系统上多线程应用程序仅在空闲的systems.
  • Similarly,上执行可能会获得额外的、隐藏的CPU。过去的时间度量并不能捕捉到多线程applications.
  • Java需要一些“预热”的全部复杂性。VM将首先解释代码(这很慢),如果给定的方法被使用太多次,那么JIT编译器会将该方法转换为本机代码。只有在这一点上,该方法才能达到最快速度。我建议你在调用System.currentTimeMillis()System.currentTimeMillis().
  • Accuracy之前执行几个“空循环”,很少是1ms。在许多系统上,精度不超过10毫秒,甚至更高。此外,JVM有时会运行GC,导致明显的暂停。我建议你以循环的方式组织你的测量,并坚持至少跑几秒钟。

这将生成以下代码:

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);
}

如您所见,有前十个“空”运行。然后程序在一个循环中运行该方法,需要多少次就运行多少次,这样循环至少需要10秒。10秒应该足以消除GC运行和其他系统错误。当我测试散列函数的实现时,我使用了两秒钟,即使函数本身根本不触发内存分配,我仍然得到了高达3%的变化。

票数 21
EN

Stack Overflow用户

发布于 2010-03-09 03:08:37

我通常用

System.currentTimeMillis()

要计算时间增量,请执行以下操作:

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

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

编辑:也可以用System.nanoTime()做同样的事情,但你不能保证准确度是纳秒。

票数 14
EN

Stack Overflow用户

发布于 2010-03-09 03:25:21

这是另一种方式(纳秒)

long nanos = System.nanoTime();
// execute your stuff
long duration = System.nanoTime() - nanos;
int seconds = (int) (duration / 1000000000);
int milliseconds = (int) (duration / 1000000) % 1000;
int nanoseconds = (int) (duration % 1000000);
System.out.printf("%d seconds, %d milliseconds en %d nanoseconds\n", seconds, milliseconds, nanoseconds);

nanos是额外的,但很好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2403921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档