繁体   English   中英

相同的字节码意味着源代码相同吗?

[英]does same byte code means source code same?

我在for循环中声明了一个变量并编译了该类。 在下一课中,我做了同样的事情,但是这次我只是在循环外声明了变量。 在这两种情况下,生成的字节代码都是相同的,但是当jvm执行的两种性能读取的代码不同时。

我的问题是:

  1. 相同的字节代码是否意味着相同的源代码? (我认为不,因为我每次都有不同的代码)

  2. 相同的JVM如何为相同的字节码提供不同的性能度量。 (我已经多次捕获每个字节码的数据,因此我在问这个问题。也使用相同的JVM,并且系统上没有运行其他应用程序)

在Java中,有如此多的链接可用于变量在循环内外的声明。

我真的在等待一个最有力的答案!

相同的字节代码是否意味着相同的源代码? (我认为不,因为我每次都有不同的代码)

不一样 例如,源代码中的注释和空格不会出现在字节码中。 变量名和其他名称也没有。 (变量名称通常确实会出现在类文件的其他位置。)

同样,同一算法的两个等效表达式也可以编译为相同的字节码。

相同的JVM如何为相同的字节码提供不同的性能度量。

我可以想到许多原因:

  • 这可能只是由于基准测试设计不当造成的假象。 Java基准测试的一个典型错误是没有正确考虑“ JVM预热”的影响。

  • 这可能是由于您调用代码的方式不同。

  • 这可能是由于输入的差异。 (JIT使用在执行初期收集的统计信息来决定如何优化代码。不同的输入可能会导致不同的执行状态……以及不同的优化代码。)

  • 这可能是由于在进行测试时系统上发生了其他事情。


这是我的性能读数(以毫秒为单位)变量10076ms的外部声明变量10100ms的内部声明变量10130ms的外部声明变量10274ms的内部声明

差异很小可能很容易归因于硬件因素/环境因素; 例如CPU频率缩放或光盘旋转延迟。 请注意,10076和10100之间的差异比10076和10130之间的差异小。


如果您想要确定的答案,则需要提供测试的完整代码,以便人们可以检查问题并尝试重现您的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM