![]() |
1
5
这是一个有趣的问题,但老实说,我不相信在这里考虑热点的行为会产生有用的信息。你得到的任何答案在一般情况下都是不可转移的(因为我们正在研究hotspot在一种特定情况下的性能优化),所以它们将帮助你理解为什么一个no op比另一个更快, 但他们不会帮你写出更快的“真实”程序 . 围绕这类事情编写非常容易误导的微观基准也非常容易-请看 this IBM DW article 对于一些常见的陷阱,如何避免它们和一些一般性的评论你在做什么。 所以这确实是一个“无可奉告”的回答,但我认为这是唯一有效的回答。编译时琐碎的no op循环不 需要 为了更快,所以编译器在某些情况下没有被优化为更快。 |
![]() |
2
4
您可能正在使用32位jvm。对于64位的jvm,结果可能会有所不同。在32位jvm中,int可以映射到本机32位整数,并通过单个操作递增。同样的情况不会持续很长时间,这将需要更多的操作来增加。 看到这个 question 关于内码和长码的讨论。 |
![]() |
3
3
我的猜测-这只是一个猜测-是不是: jvm的结论是第一个循环实际上什么也不做,所以它完全删除了它。for循环中没有变量“转义”。 在第二种情况下,循环也不做任何事情。但是,确定循环不执行任何操作的jvm代码可能有一个“if(type of i)==int”子句。在这种情况下,删除do nothing for循环的优化只适用于int。 删除代码的优化必须确保没有副作用。jvm代码编写者似乎是出于谨慎而犯了错误。 |
![]() |
4
1
这样的微基准测试没有太多意义,因为结果在很大程度上依赖于hotspot jit的内部工作。
另外,请注意您使用的系统时钟值
看看这篇文章,这就解释了为什么Java中的微基准不是像大多数人想象的那么简单: Anatomy of a flawed microbenchmark |
![]() |
ma3oun · 如何嵌套numba jitclass 8 年前 |
![]() |
Paul J. Lucas · 从LLVM IR访问结构成员和结构数组 9 年前 |
![]() |
Neo · 在JIT的帮助下,程序运行的时间越长,速度越快?[已关闭] 9 年前 |
![]() |
galinette · LLVM JIT:如何禁用自动函数解析? 11 年前 |