Java 如果可以关闭JIT,为什么要使用JMH?

Java 如果可以关闭JIT,为什么要使用JMH?,java,jit,jmh,Java,Jit,Jmh,如果我可以关闭JIT,我想知道为什么我应该使用JMH进行基准测试? JMH不是在抑制可以通过禁用JIT来防止的优化吗?JIT不是防弹的,也不是万能的。例如,在某段代码运行一定次数之前它不会被踢入,或者如果一段字节码太大/太深埋入了它,它就不会被踢入。同样,也要考虑实时的仪器,这通常会阻止JIT完全地操作(思考剖析)。 因此,兴趣仍然在于能够关闭或打开它;如果一段代码确实是时间关键的,您可能想知道它将如何执行,这取决于JIT是否生效 但是这种情况非常罕见,而且随着JVM(因此JIT)的发展,这种情

如果我可以关闭JIT,我想知道为什么我应该使用JMH进行基准测试?
JMH不是在抑制可以通过禁用JIT来防止的优化吗?

JIT不是防弹的,也不是万能的。例如,在某段代码运行一定次数之前它不会被踢入,或者如果一段字节码太大/太深埋入了它,它就不会被踢入。同样,也要考虑实时的仪器,这通常会阻止JIT完全地操作(思考剖析)。 因此,兴趣仍然在于能够关闭或打开它;如果一段代码确实是时间关键的,您可能想知道它将如何执行,这取决于JIT是否生效


但是这种情况非常罕见,而且随着JVM(因此JIT)的发展,这种情况变得越来越罕见。

JIT并不是防弹的和万能的。例如,在某段代码运行一定次数之前它不会被踢入,或者如果一段字节码太大/太深埋入了它,它就不会被踢入。同样,也要考虑实时的仪器,这通常会阻止JIT完全地操作(思考剖析)。 因此,兴趣仍然在于能够关闭或打开它;如果一段代码确实是时间关键的,您可能想知道它将如何执行,这取决于JIT是否生效


但是这些情况非常罕见,并且随着JVM(因此JIT)的发展,这种情况变得越来越罕见;博士在同一赛道上骑自行车,评估一级方程式赛车的性能。

这个问题很奇怪,特别是如果你问自己一个简单的后续问题。在与生产环境截然不同的条件下运行基准测试有什么意义?换句话说,在解释模式下获得的知识如何应用于现实世界

这里的问题不是黑白分明的:你需要在现实世界中进行优化,你需要在一些精心挑选的地方进行优化,以建立一个良好的实验设置。这就是JMH正在做的:它提供了构建实验装置的方法。很好地解释复杂的情况和场景


而且,好吧,基准测试不仅仅是为了对抗编译器。大量的非编译器(和非JVM!)问题。当然,它可以手工完成(JMH并不神奇,它只是一个由人类编写的工具),但你将把大部分时间花在解决简单的问题上,而没有时间解决真正重要的问题,具体到你的实验上。

TL;博士在同一赛道上骑自行车,评估一级方程式赛车的性能。

这个问题很奇怪,特别是如果你问自己一个简单的后续问题。在与生产环境截然不同的条件下运行基准测试有什么意义?换句话说,在解释模式下获得的知识如何应用于现实世界

这里的问题不是黑白分明的:你需要在现实世界中进行优化,你需要在一些精心挑选的地方进行优化,以建立一个良好的实验设置。这就是JMH正在做的:它提供了构建实验装置的方法。很好地解释复杂的情况和场景


而且,好吧,基准测试不仅仅是为了对抗编译器。大量的非编译器(和非JVM!)问题。当然,这可以手工完成(JMH并不神奇,它只是一个由人类编写的工具),但您将花费大部分时间解决简单的问题,而没有时间解决真正重要的问题,具体到您的实验。

感谢您的回答。我只是想知道为什么我更喜欢JMH和JIT,而不是一个“普通”的自制基准测试,它有预热运行和足够多的迭代而没有JIT。JMH给了一些安慰,但还有什么?我真的很想知道。也许这有助于理解我的问题。谢谢你的回答。我只是想知道为什么我更喜欢JMH和JIT,而不是一个“普通”的自制基准测试,它有预热运行和足够多的迭代而没有JIT。JMH给了一些安慰,但还有什么?我真的很想知道。也许这有助于理解我的问题。事实上,即使连接探查器也可以禁用优化。JMH是一个非常好的工具,因为它允许以最少的干扰进行基准测试和分析(正如海森堡不确定性原则所允许的那样:),事实上,即使连接一个分析程序也可以禁用优化。JMH是一个很好的工具,因为它允许在干扰最小的情况下进行基准测试和分析(正如海森堡不确定性原理所允许的那样:)