没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
Java 理论与实践: 动态编译与性能测量
简介: 为动态编译的语言(例如 Java)编写和解释性能评测,要比为静态编译的语言(例如 C
或 C++)编写困难得多。在这期的 Java
理论与实践
中,Brian Goetz 介绍了动态编译使性能
测试复杂的诸多原因中的一些。
这个月,我着手撰写一篇文章,分析一个写得很糟糕的微评测。毕竟,我们的程序员一直受性能困扰,我
们也都想了解我们编写、使用或批评的代码的性能特征。当我偶然间写到性能这个主题时,我经常得到这
样的电子邮件:“我写的这个程序显示,动态 frosternation 要比静态 blestification 快,与您上一篇的观点
相反!”许多随这类电子邮件而来的所谓“评测“程序,或者它们运行的方式,明显表现出他们对于 JVM 执行
字节码的实际方式缺乏基本认识。所以,在我着手撰写这样一篇文章(将在未来的专栏中发表)之前,我
们先来看看 JVM 幕后的东西。理解动态编译和优化,是理解如何区分微评测好坏的关键(不幸的是,好
的微评测很少)。
动态编译简史
Java 应用程序的编译过程与静态编译语言(例如 C 或 C++)不同。静态编译器直接把源代码转换成可以
直接在目标平台上执行的机器代码,不同的硬件平台要求不同的编译器。 Java 编译器把 Java 源代码转
换成可移植的 JVM 字节码,所谓字节码指的是 JVM 的“虚拟机器指令”。与静态编译器不同,javac 几乎
不做什么优化 —— 在静态编译语言中应当由编译器进行的优化工作,在 Java 中是在程序执行的时候,
由运行时执行。
第一代 JVM 完全是解释的。JVM 解释字节码,而不是把字节码编译成机器码并直接执行机器码。当然,
这种技术不会提供最好的性能,因为系统在执行解释器上花费的时间,比在需要运行的程序上花费的时间
还要多。
即时编译
对于证实概念的实现来说,解释是合适的,但是早期的 JVM 由于太慢,迅速获得了一个坏名声。下一代
JVM 使用即时 (JIT) 编译器来提高执行速度。按照严格的定义,基于 JIT 的虚拟机在执行之前,把所有
字节码转换成机器码,但是以惰性方式来做这项工作:JIT 只有在确定某个代码路径将要执行的时候,才
编译这个代码路径(因此有了名称“
即时
编译”)。这个技术使程序能启动得更快,因为在开始执行之前,
不需要冗长的编译阶段。
JIT 技术看起来很有前途,但是它有一些不足。JIT 消除了解释的负担(以额外的启动成本为代价),但
是由于若干原因,代码的优化等级仍然是一般般。为了避免 Java 应用程序严重的启动延迟,JIT 编译器
必须非常迅速,这意味着它无法把大量时间花在优化上。所以,早期的 JIT 编译器在进行内联假设(inlining
assumption)方面比较保守,因为它们不知道后面可能要装入哪个类。
虽然从技术上讲,基于 JIT 的虚拟机在执行字节码之前,要先编译字节码,但是 JIT 这个术语通常被用来
表示任何把字节码转换成机器码的动态编译过程 —— 即使那些能够解释字节码的过程也算。
HotSpot 动态编译
HotSpot 执行过程组合了编译、性能分析以及动态编译。它没有把所有要执行的字节码转换成机器码,而
是先以解释器的方式运行,只编译“热门”代码 —— 执行得最频繁的代码。当 HotSpot 执行时,会搜集性
能分析数据,用来决定哪个代码段执行得足够频繁,值得编译。只编译执行最频繁的代码有几项性能优势:
没有把时间浪费在编译那些不经常执行的代码上;这样,编译器就可以花更多时间来优化热门代码路径,
因为它知道在这上面花的时间物有所值。而且,通过延迟编译,编译器可以访问性能分析数据,并用这些
数据来改进优化决策,例如是否需要内联某个方法调用。
为了让事情变得更复杂,HotSpot 提供了两个编译器:客户机编译器和服务器编译器。默认采用客户机编
译器;在启动 JVM 时,您可以指定 -server 开关,选择服务器编译器。服务器编译器针对最大峰值
大头蚊香蛙
- 粉丝: 17
- 资源: 317
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 以简单、易用、高性能为目标、开源的时序数据库,支持Linux及Windows, Time Series Database.zip
- python-leetcode面试题解之第198题打家劫舍-题解.zip
- python-leetcode面试题解之第191题位1的个数-题解.zip
- python-leetcode面试题解之第186题反转字符串中的单词II-题解.zip
- 一个基于python的web后端高性能开发框架,下载可用
- python-leetcode面试题解之第179题最大数-题解.zip
- python-leetcode面试题解之第170题两数之和III数据结构设计-题解.zip
- python-leetcode面试题解之第168题Excel表列名称-题解.zip
- python-leetcode面试题解之第167题两数之和II输入有序数组-题解.zip
- python-leetcode面试题解之第166题分数到小数-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0