我在for循环中声明了一个变量并编译了该类。在下一课我做了同样的事情,但这次我只是声明了变量外循环。在这两种情况下,生成的字节代码都相同,但是当jvm执行时,两个性能读数的代码都不同。
我的问题是:
相同的字节代码是否意味着相同的源代码? (我认为不,因为我每次都有不同的代码)
相同的JVM如何为相同的字节码提供不同的性能测量。 (我已经多次捕获每个字节码的数据,因此我问这个问题。还使用了相同的JVM,系统上没有运行其他应用程序)
java中有很多可用于循环内外变量声明的链接。
我真的在等待最强烈的答案!!!
答案 0 :(得分:3)
相同的字节代码是否意味着相同的源代码? (我想不是因为我每次都有不同的代码)
不完全相同。例如,源代码中的注释和空格不会出现在字节码中。并且变量的名称和其他东西都没有。 (变量名通常会出现在类文件的其他地方。)
此外,同一算法的两个等效表达式可以编译为相同的字节码。
相同的JVM如何为相同的字节码提供不同的性能测量。
我可以想到很多原因:
它可能只是一个由您的基准设计不佳引起的人工制品。典型的Java基准测试错误是没有正确考虑“JVM预热”效应。
这可能是由于您调用代码的方式不同。
可能是由于输入的差异。 (JIT利用在执行早期收集的统计信息来决定如何优化代码。不同的输入可能导致不同的执行统计数据......以及不同优化的代码。)
这可能是由于您在进行测试时系统上发生的其他事情。
以下是我的性能读数(以毫秒为单位)外部声明变量10076ms内部声明变量10100 ms外部声明变量10130ms内部声明变量10274ms
由于硬件因素/环境因素导致的差异很小;例如CPU频率缩放或光盘旋转延迟。请注意,10076和10100之间的差异小于10076和10130之间的差异。
如果您需要明确的答案,则需要提供测试的完整代码,以便人们可以检查问题并尝试重现您的结果。