java - 用 Java 测量时间

标签 java performance time profiling

所以我试图测量两种不同算法实现完成给定任务所花费的时间,结果如下:

i    alg1  alg2
4   0.002   0.0
5   0.001   0.0
6   0.003   0.002
7   0.023   0.01
8   0.055   0.041
9   0.056   0.0
10  0.208   0.101
11  1.767   0.694
12  18.581  7.784

i 只是一些输入参数。

我已经测量了使用以下(原始)函数的算法的性能:

private double getDuration() {
    return (double)(System.currentTimeMillis() - startTime) / (double)1000;
}

与使用 System.currentTimeMillis() 相比,获得更多真实结果(0.0 除外,这显然不是真的!)的最佳方法是什么?我知道我可以一遍又一遍地运行算法并对它们的结果求和,但我有这种直觉,可能有一些更强大的方法来测量 Java 中耗时(realusersys,如果可能的话!)。

谢谢

最佳答案

对于基本计时,您可以使用 Guava 的 Stopwatch class (或者,如果您不想引入整个 Guava 库,则只获取其源代码)。有关更完整的基准测试解决方案,请参阅 Caliper由同一个团队。

这两个都基于 System.nanoTime(),您应该更喜欢 System.currentTimeMillis() 来测量耗时。基本原因是 System.currentTimeMillis() 是一个“时钟”(试图返回挂钟时间)而 System.nanoTime() 是一个“计时器” (它试图从某个任意点返回时间)。

当您试图确定单个事件发生的时间时,您需要一个时钟,因此您可以将它与您的 watch 或墙上的时钟(或其他计算机中的时钟)对齐。但它不适合测量同一系统上两个事件之间耗时,因为计算机偶尔会调整其内部时钟如何对应于挂钟时间的概念。例如,如果你这样做

long timeA = System.currentTimeMillis();
doStuff();
long timeB = System.currentTimeMillis();
System.out.println("Elapsed time: " + (timeB - timeA));

如果在执行 doStuff() 时 NTP 向后调整,则可能会得到负面结果。 System.nanoTime(),作为计时器而不是时钟,应该忽略该调整,从而避免此问题。

(请注意,以上所有内容都是概念性的;不幸的是,在实现级别上事情可能会变得困惑。但这不会改变建议:System.nanoTime() 应该是最好的你可以在你的平台上获得计时器,System.currentMilliseconds() 应该是你可以获得的最好的时钟。)

关于java - 用 Java 测量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458234/

相关文章:

java - Actor 模型与外部系统的异步通信

java - Jtree导航器

java - JFreeChart:如何将箭头放在散点图中轴线的末端

python - 让 Python 打印一天中的小时数

java - 在 Java 中只处理小时和分钟的最佳方法

r - 在 R 中处理时间戳

java - JNI 回调调用失败

java - 编译器使用关联性有什么问题?

javascript - 将文档和窗口引用存储在对象中以获得更好的性能

javascript - 如何找出网页的CPU瓶颈