假设我有一些代码,我想最大限度地优化它,无视可读性,可维护性等。
为此目的,无论如何要确定每个基本动作花费多少时间?我想这可能与CPU有关,但我不确定。
我的意思是循环使用for
,作业a=24
,数学运算2+25
等等。
答案 0 :(得分:7)
背景很重要。各种Java语言结构没有固定成本,您可以将它们加起来以获得有用的运行时估计的近似值。 您似乎希望的答案并不存在。
例如,即使您设法正确设计了微基准测量以测量某些if()s
与switch
,但结果将严重依赖于周围的代码,具体情况如何是的,以及分支的可预测性。制作微基准测试是 hard 。除非您查看实际在循环中运行的机器指令,否则通常最终会测量除您想要的内容之外的其他内容。如果您不使用结果,那么优秀的编译器也很容易优化您的循环,但是很难以不会创建更多结果的方式使用结果比您尝试衡量的费用高。
一个优秀的JIT编译器JVM应该生成的机器代码不会比你希望的更糟糕,所以如果你很好地了解C如何编译到ASM,这可能是有用的对于java。
如果您想了解现代x86微体系结构的快速与慢速,请查看Agner Fog's guides。
一个好的分析工具可以帮助您确定您的代码是否受CPU限制或内存瓶颈(缓存未命中:内存带宽或延迟)或分支错误预测。我还没有为Java做过这个,但是标准工具(比如Linux perf
)可能会起作用,只要你使用足够长的运行来隐藏JVM启动的开销。
答案 1 :(得分:0)
您可以执行以下操作:
long startTime = System.currentTimeMillis();
// ---- Your code ----
long endTime = System.currentTimeMillis()
System.out.println("The previous line took " + (endTime - startTime) + " ms");