当只关心几个算法的相对性能时,我最好强制Java永远不要JIT编译我的方法



当比较两种不同的算法实现时(因此,不关心它们的绝对性能,而只关心相对性能),我是否更适合强制Java只运行解释代码?

也就是说,打开-Xint标志会更好吗?

我认为您最好禁用JIT。

要么决定测量抽象的、渐近的性能(在这种情况下,你肯定想要big-O表示法),要么决定测量给定机器上给定实现对给定输入数据的性能。

如果您决定采用后者,那么禁用JIT将是毫无意义的:您想要的是在现实的环境中衡量性能,而在实际的环境中,您通常会进行JIT编译。

从理论的角度来看,是的,这应该可以保证您将获得关于一个与另一个相比效率的准确结果。如果花更少的时间,结果是显而易见的。

然而,在某些情况下(尽管我认为可能性不大),您认为较慢的算法可能更适合JITing,并且当允许Java对其进行优化时,它会更快

衡量Java性能的常用方法是让它先"预热"——先运行算法几次(请参阅-XX:CompileThreshold),让它进行编译,然后计时。

两者都有。

如果您正在执行基准测试,则需要了解哪些环境设置会影响性能的信息。

您可能无法在所有可用的计算机配置下运行算法,但应考虑打开/关闭JIT的效果。

问题是…你会在生产中也禁用JIT吗。。。性能分析的艺术是确保你确实在测量你试图观察、理解和优化的同一事物(模型)。

如果你想比较算法,而不想在现实条件下(负载、环境、状态…)实际分析它们的行为,那么你可以使用久经考验的方法,为每个执行成本驱动因素创建一个成本表,然后在测试的执行(或演练)中对这些成本求和。

最新更新