我如何计算在 Java 中执行某行需要多少时间?

How do I figure how much time it takes for some line to be executed in Java?

假设我有一些代码,我想最大限度地优化它,忽略可读性、可维护性等。

为此,有没有办法算出每个基本动作需要多少时间?我想这可能是 CPU 相关的,但我不确定。

我指的是循环 for、作业 a=24、数学运算 2+25

你可以这样做:

long startTime = System.currentTimeMillis();
// ---- Your code ----
long endTime = System.currentTimeMillis()
System.out.println("The previous line took " + (endTime - startTime) + " ms");

上下文很重要。各种 Java 语言结构没有固定成本,您可以将它们相加以获得有用的 运行 时间估计的近似值。 你似乎希望得到的答案并不存在。

例如,即使您确实设法正确设计了一个微基准测试来衡量一些 if()sswitch,结果将在很大程度上依赖于周围的代码,细节案件是,以及分支机构的可预测性。进行微基准测试困难。除非您查看循环中实际 运行 的机器指令,否则您通常最终会测量出您想要测量的东西。如果您不使用结果,一个好的编译器也很容易优化您的循环,但是很难以不会产生比您尝试测量的开销更多的方式使用结果。

一个好的 JIT 编译器 JVM 应该生成不会比你希望的差太多的机器代码,所以如果你对 C 如何编译成 ASM 有很好的了解,那可能对 java.

如果您想了解现代 x86 微体系结构的快与慢,请查看 Agner Fog's guides

一个好的分析工具可以帮助您确定您的代码是否受 CPU 限制或内存瓶颈(缓存未命中:内存带宽或延迟),或分支预测错误。我还没有为 Java 执行此操作,但标准工具(如 Linux 的 perf)可能会工作,只要你使用足够长的 运行 隐藏开销JVM 启动。