我正在将一些C++代码转换为Java,我想知道我可以对内联函数做些什么。我是否可以假设虚拟机内置函数(必要时),而不用担心这一点?如何进行配置以观察此行为?假设有一个主要的外部函数,并且我为它引发了一个for循环并引发了一百万次调用。我应该期望看到虚拟机内存越来越多地得到改进吗?根据需要,热点VM内联功能是否会启用?
1
A
回答
4
是的,Java会内联方法调用。内联由JIT编译器执行,因此您不会通过检查字节码文件来查看它。
对于给定的方法调用是否实际发生内联取决于方法体的大小以及调用是否可以内联。 (如果一个方法调用涉及调度...在JVM有一堆旨在消除不必要的调度的全局优化之后......则不能内联)。
这同样适用于您的外部主函数的示例。这取决于方法体的大小。另一方面,如果该方法需要大量时间来执行,则优化的相对重要性相应地降低。
我的建议是在这个阶段不要担心这样的事情。只需清楚简单地编写代码,并让JIT编译器处理优化问题。当您的应用程序正在运行时,您可以对其进行配置并查看代码中是否有任何值得手动优化的“热点”。
但我应该能够看到这个东西像Visual VM吧?我的意思是最初没有内联,然后越来越多的东西被内联,所以外部方法的平均时间略有减少。
它可能是可观察的,也可能不是,这取决于调用相对于执行方法体所花费的时间。 (剖析通常依赖于对程序计数器进行采样,如果给定代码区域的样本数量太小以及出于其他原因,报告的时间可能不准确。)
它也取决于您的JVM正在使用。并非所有的JVM都会重新优化他们之前优化过的代码。
最后,有一种方法可以让JVM转储由JIT编译器输出的本地代码。如果您准备阅读机器说明,这将给您一个确定内容的明确答案。
相关问题
- 1. 微型过滤器功能是否需要启用APC?
- 2. PHP需要功能使用根
- 3. 复制的会话是否需要启用粘性会话?
- 4. 是否需要释放内存才能重新启动redis?
- 5. 点击功能需要2次点击
- 6. 我是否需要启用SQL 2005上的Service Broker端点才能使用SQLCacheDependency?
- 7. doClick()是否需要启用组件?
- 8. 是否需要为Firebase部署云端功能所需的节点
- 9. 我是否需要在火力点功能上使用recaptcha的付费计划?
- 10. jQuery点击功能vs内联onclick
- 11. 是否启用安全保护功能
- 12. 还有什么功能需要启用才能使用“form_factor”
- 13. .htaccess将不会根据需要重写
- 14. Google LocationServices是否需要互联网?
- 15. iPhone需要的设备功能 - 内存
- 16. 需要Flex AdvancedDatagrid内嵌评论功能
- 17. VB.net需要内存高效功能
- 18. 功能内点击事件需要点击2次才能触发
- 19. 节点:需要模块内部功能吗?
- 20. Flow内容是否需要Palpable内容?
- 21. 需要ASORT功能
- 22. getElementByTagName功能需要
- 23. 确定点A是否需要切角才能到达点B
- 24. 需要启用Javascript才能使用Mechanize + BeautifulSoup(Python)的站点需要启用Javascript的站点
- 25. 这是功能保证内联扩展
- 26. Javascript:当在功能中添加if时,是否需要添加任何内容?
- 27. Erlang在节点/ VM重启之间是否唯一?
- 28. 内联ckeditor需要htmlspecialchars吗?
- 29. 传递数据需要功能
- 30. .live()是否需要选择器才能启动?
但我应该能够看到这个像Visual VM的东西吧?我的意思是最初没有内联,然后越来越多的东西被内联,所以外部方法的平均时间略有减少。 – Nikhil 2012-04-22 05:47:50