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

我如何计算在Java中执行某一行需要多少时间?,java,performance,low-level,Java,Performance,Low Level,假设我有一些代码,我想最大限度地优化它,而不考虑可读性、可维护性等 为此,有没有办法计算出每个基本行动需要多少时间?我想这可能与CPU有关,但我不确定 我指的是像为在中循环、作业a=24、数学运算2+25,等等。你可以这样做: long startTime = System.currentTimeMillis(); // ---- Your code ---- long endTime = System.currentTimeMillis() System.out.println("The pr

假设我有一些代码,我想最大限度地优化它,而不考虑可读性、可维护性等

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


我指的是像为在
中循环、作业
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()s
开关的差异,结果也将严重依赖于周围的代码、案例的细节以及分支的可预测性。制作微基准很难。通常,除非您查看循环中实际运行的机器指令,否则您最终会测量一些与您预期不同的内容。如果不使用结果,一个好的编译器也很容易优化循环,但是很难以一种不会产生比您试图度量的更多开销的方式使用结果

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

如果您想了解现代x86微体系结构上的快与慢,请参阅


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

那么我怎么知道
System.nanoTime()
需要多少时间呢?当然,这会增加很多。他的意思是在两条指令之间使用以纳秒为单位的当前时间,可以得到执行时间。@BenoitVanalderweireldt好吧,假设我使用
System.nanoTime();2+25; System.nanoTime()然后,如果nanoTime需要0来完成,我可以知道执行
2+25
所需的时间,但这也包含执行
System.nanoTime()
所需的时间。请使用。您不能。该“代码行”被翻译成字节码,在一个程序的单个启动过程中可以以多种不同的方式执行;System.currentTimeInMillis
在前几行的完成和输出之间添加一段相当长的时间?如果希望更精确,可以使用更细粒度的时间度量,如
纳米时间