如何测量用编写的代码的速度?
我计划开发软件,使用目前所有可用的AI和ML算法来解决数独问题,并将时间与简单的蛮力方法进行比较。我需要测量每个算法的时间,我想请教一下做这件事的最佳方法是什么?非常重要的是,程序必须在任何机器上都是有用的,无论CPU功率/内存如何。
谢谢。
发布于 2010-03-09 04:11:17
正如其他人建议的那样,System.currentTimeMillis()
非常好,但请注意以下注意事项:
System.currentTimeMillis()
测量的是物理时间(“挂钟时间”),而不是CPU时间。如果机器上正在运行其他应用程序,您的代码将获得较少的CPU,并且其速度将会降低。因此,多核系统上多线程应用程序仅在空闲的systems.System.currentTimeMillis()
的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);
}
如您所见,有前十个“空”运行。然后程序在一个循环中运行该方法,需要多少次就运行多少次,这样循环至少需要10秒。10秒应该足以消除GC运行和其他系统错误。当我测试散列函数的实现时,我使用了两秒钟,即使函数本身根本不触发内存分配,我仍然得到了高达3%的变化。
发布于 2010-03-09 03:08:37
我通常用
System.currentTimeMillis()
要计算时间增量,请执行以下操作:
long start = System.currentTimeMillis();
/* do your algorithm iteration */
long elapsed = System.currentTimeMillis() - start;
请记住,根据您使用的操作系统,函数的精度可能大于1毫秒(也就是十分之一毫秒),因此您必须对其进行调整,以便对您的分析有用。
编辑:也可以用System.nanoTime()
做同样的事情,但你不能保证准确度是纳秒。
发布于 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是额外的,但很好。
https://stackoverflow.com/questions/2403921
复制相似问题