荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Lg (从零开始), 信区: Java
标  题: Java的动态编译技术(2)
发信站: 深圳大学荔园晨风电子公告牌 (Fri May  1 02:29:13 1998), 站内信件

发信人: seyior (大傻), 信区: Java
标 题: Java的动态编译技术(2
发信站: 饮水思源站 (Thu Apr 23 22:44:11 1998) , 转信

动 态 编 译 是 如 何 工 作 的。

---- HotSpot 同 时 包 括 了 一 个 动 态 编 译 器 和 一 个 虚 拟 机 来 解 释 字
节 码
- 当 字 节 码 第 一 次 被 加 载 时, 它 们 以 解 释 方 式 执 行。Profiler 记 录
 下 了 每
一 个 方 法 的 运 行 时 间。 当 某 个 方 法 被 认 为 是 占 据 了 许 多 时 间 的
 时
候,HotSpot 对 它 进 行 编 译 并 加 以 优 化。 在 以 后, 当 调 用 这 个 方 法
的 时
候, 就 会 去 调 用 由 编 译 器 生 成 的 本 地 机 器 指 令。

---- 与 一 个JIT 相 似, 利 用 这 种 动 态 编 译 技 术 时, 前 一 次 应 用 程 序
 运 行 时
所 编 译 的 结 果 并 不 能 保 留 到 下 次 程 序 运 行 时 使 用。 由 于 字 节 码
 更 为 紧
凑, 因 而 它 不 但 能 节 省 存 储 空 间 而 且 能 节 省 载 入 程 序 的 时 间。
这 种 技
术 同 样 也 保 存 了 可 移 植 性, 并 允 许 优 化 程 序 来 重 新 考 虑 程 序 当
 前 所 使
用 的 方 法。 就 目 前 而 言, 还 没 有 人 尝 试 过 将 运 行 时 所 编 译 出 来
的 结 果
存 储 起 来, 以 便 下 一 次 程 序 运 行 时 能 够 得 到 更 高 的 效 率 和 更 快
 的 速
度。 尽 管 这 种 方 法 或 许 在 将 来 能 够 成 为 现 实, 但 眼 下Sun 还 没 有
将 其 提
上 计 划 日 程。

探 索 式 地 剖 析(Profile) 和 编 译

---- 这 个 系 统 最 使 人 着 迷 的 地 方( 至 少 对 于 那 些 对 机 器 推 理 这 一
 主 题 感
兴 趣 的 人 来 说) 在 于profiler 是 如 何 决 定 哪 个 方 法 需 要 被 优 化。 当
 前 的 这 个
系 统 采 用 了 一 个 非 常 微 小 的, 与 任 何 人 工 智 能 完 全 无 关 的 探 索
 器。 尽
管 具 体 的 细 节 只 有 设 计 者 才 知 道, 但 是 可 以 合 理 推 测 到 系 统 是
 通 过 对
某 个 方 法 占 用 时 间 情 况 的 预 测 来 优 化 这 个 方 法 的。 一 旦 某 个 方
 法 所 使
用 的 时 间 达 到 了 预 先 确 定 的 极 限, 举 例 说, 达 到 了70% 的 预 定 时
间, 那
么, 这 个 方 法 就 成 为 需 要 进 行 优 化 的 候 选 者。( 具 体 的 极 限 值 豪
 无 疑 问
是 无 数 次 研 究 的 结 果。)

---- 幸 运 的 是, 如Sun 公 司 的 人 所 说, 对 于 这 种 系 统, 要 求 其 完 美
 无 缺 是
没 有 必 要 的。 只 要 它 在 大 多 数 情 况 下 运 行 良 好, 能 够 极 大 地 改
善 程 序
的 运 行 效 率, 也 就 达 到 了 目 的。

---- 而 且, 谁 会 知 道 ? 在 将 来 的 某 一 天, 可 能 会 有 更 为 先 进 的 人
 工 智 能
探 索 器 被 应 用 到 这 一 领 域。 尽 管 还 没 有 严 格 的 计 划 来 追 求 这 种
 可 能 性
-- Sun 公 司 希 望 在 未 来 的 一 两 年 内 全 力 以 赴 地 精 炼 目 前 的 实 现
-- 但 它 终
究 是 一 个 吸 引 人 去 考 虑 的 可 能 性。

动 态 编 译 的 优 势

---- 将 一 个 编 译 器 和 一 个 解 释 器 集 成 在 一 起 的 精 彩 之 处 在 于 它
 能 够 做
一 些 通 常 情 况 下 静 态 编 译 器 无 法 实 现 的 事 件。 特 别 是 它 能 够 完
 成 优 化
编 译, 并 且 能 够 利 用 运 行 时 刻 的 信 息 来 做 强 健 的 内 联.

---- 优 化 编 译

---- 由 于 在 运 行 时 刻, 解 释 器 总 可 以 随 时 得 到, 因 此HotSpot 的 动
态 编 译
器 可 以 假 设 异 常 及 其 它 难 以 优 化 的 情 况 不 会 出 现。 如 果 它 们 确
 实 出 现
了,HotSpot 就 可 返 回 来 解 释 执 行 字 节 码。 对 于 静 态 编 译, 对 异 常
情 况 的
处 理 进 行 优 化 是 一 件 困 难 而 耗 时 的 过 程。 通 过 忽 略 这 些 情 况,
HotSpot 能
够 非 常 迅 速 地 为 那 些 最 有 可 能 运 行 的 代 码 生 成 高 度 优 化 的 代 码
。 这 如
同 给 赛 马 注 入 了 激 素 -- 在 时 间 优 化 方 面, 以 非 常 小 的 投 入, 换
得 了 重
大 的 性 能 提 高。

---- 运 行 时 刻 信 息

---- 动 态 编 译 的 第 二 个 主 要 优 势 在 于 其 能 够 将 只 有 在 运 行 时 刻
 才 能 了
解 到 的 信 息 考 虑 在 内。 同 样, 这 一 技 术 的 细 节 仍 然 只 有 开 发 者
才 知
道。 但 是 想 象 它 却 并 不 困 难, 例 如, 如 果 在 一 个 循 环 中, 一 个 方
 法 被 重
复 调 用, 直 至 某 个 下 标 的 值 为10,000( 也 就 是 说 这 个 方 法 被 重 复

用10,000 次), 那 么 这 个 方 法 马 上 就 会 成 为 将 被 优 化 的 候 选 者。 但
 是,
如 果 在 这 个 循 环 中, 其 最 高 的 下 标 值 为1, 则 优 化 器 就 会 忽 略 这
 一 方
法, 使 其 被 解 释 执 行。 由 于 静 态 编 译 器 无 法 知 道 在 运 行 时 刻 的
变 量 的
具 体 值, 因 此 它 不 能 对 这 种 情 况 作 出 相 应 的 判 断。

---- 内 联

---- HotSpot 所 执 行 的 另 一 个 重 要 的 优 化 就 是 内 联(inlining) 那 些
频 繁 被 调
用 的 函 数。 这 意 味 着 这 些 方 法 的 应 用 不 必 花 费 额 外 的 函 数 调 用
 开 支,
而 是 通 过 将 这 些 方 法 的 代 码 直 接 拷 贝 给 调 用 例 程, 就 如 这 些 函
 数 是 这
个 例 程 的 一 部 分 一 样 加 以 使 用。 方 法 中 的 程 序 行 数 越 少, 就 越
应 该 成
为 内 联 函 数。 只 有 一 行 的 方 法 在 调 入 和 退 出 例 程 时 所 花 费 的 时
 间, 可
能 多 于 真 正 执 行 这 行 代 码 所 花 费 时 间 的 两 倍。

---- 内 联 为 性 能 的 提 高 提 供 了 强 大 的 推 动 力, 但 它 是 以 程 序 规
模 的 扩 大
为 代 价 的。 如 果 每 一 个 被 调 用 的 方 法 都 被 拷 贝 到 其 被 调 用 的 地
 方, 那
么 程 序 将 会 比 它 原 有 的 规 模 膨 胀 五 到 十 倍。 但 是HotSpot 仅 仅 优 化
 那 些
程 序 中 关 键 的 部 分。 二 八 律 表 明,80% 的 程 序 运 行 时 间 都 花 费 在
20% 的
代 码 之 上。 通 过 将 大 约20% 的 代 码 内 联,HotSpot 就 能 以 可 接 受 的 规
 模 扩
大 代 价, 换 取 运 行 性 能 的 重 大 提 高。 此 外, 运 行 时 刻 的 信 息 起 着
 重 要
的 作 用, 因 为HotSpot 凭 此 知 道 在 什 么 地 方 去 找 那 些 关 键 的20% 的 代
 码。

---- 对 于 所 有 好 事, 当 然 应 当 有 个 折 衷。 如 果 一 个 方 法 非 常 大,
 则 这 个
方 法 花 费 在 调 入 和 退 出 例 程 上 的 时 间 仅 仅 只 是 其 运 行 时 间 中 的
 一 小 部
分。 在 这 种 情 况 下, 复 制 方 法 所 导 至 程 序 空 间 膨 胀 的 代 价 远 远
大 于 内
联 所 节 省 的 时 间。 因 此,HotSpot 豪 无 疑 问, 应 当 有 一 个 上 限 来 规
定 有 多
大 规 模 的 方 法 可 以 内 联。( 然 而, 具 体 的 细 节 也 只 有 设 计 者 才 能
 知 道。)

---- 最 后, 由 于HotSpot 做 了 优 化 编 译, 它 只 能 够 内 联 正 常 执 行 的
方 法,
而 不 是 所 有 可 能 的 方 法。 因 此 它 就 可 能 不 会 劳 心 费 神 地 去 解 决
 那 些 罕
见 情 况 下 出 现 的 疑 难 问 题, 而 是 将 其 忽 略, 不 去 过 问。 这 样, 你
 就 能 够
通 过 最 小 的 优 化 努 力 得 到 最 大 的 性 能 提 高。

---- 什 么 情 况 下 动 态 编 译 会 取 得 成 功 -- 而 什 么 情 况 下 它 会 失 败

---- 在 大 多 数 情 况 下, 利 用HotSpot 比 利 用JIT 技 术 能 够 取 得 大 得 多
 的 性 能
提 高, 更 不 用 说 比 通 常 的JVM 解 释 技 术 带 来 的 益 处。 但 是, 在 不 同
 环 境
下, 任 何 性 能 提 高 技 术, 在 进 行 动 态 编 译 时 都 不 可 能 达 到 性 能
最 优
化。 例 如, 在 一 次 程 序 运 行 之 后,Profiler 就 决 定 优 化 哪 一 段 代 码
。 在 极
端 情 况 下, 优 化 器 就 会 信 誓 旦 旦 地 对 所 有 方 法 进 行 优 化, 显 而
易 见,
这 决 不 能 成 功。 当 然, 这 种 情 况 很 少 发 生。

---- 将HotSpot 技 术 应 用 于 那 些100% 的 纯 计 算 程 序 时, 得 到 的 效 果 将
 会 极
差。 这 些 程 序 几 乎 没 有 或 根 本 没 有 垃 圾 收 集, 没 有 线 程 同 步, 只
 有 少
量 的 初 始 化 代 码。 例 如, 将 前1000 个 素 数 相 乘, 并 将 结 果 输 出, 这
 样 的
程 序, 就 是 这 种 程 序 的 一 个 例 子。 对 于 这 种 程 序, 利 用 一 个 好 的
JIT, 可
能 会 得 到 更 好 的 性 能, 因 为 在 优 化 之 前,JIT 并 不 停 下 来-- 它 会 将
 所 有 的
代 码 抢 先 优 化。

---- 最 后,HotSpot 技 术 缺 少 一 种 象CaffeineMark 一 样 的 人 工 基 准
(benchmark)。
由 于 这 种 基 准 不 会 仿 效 现 实 世 界 的 程 序, 因 此 有 可 能 写 出 一 种
 可 以 探
测 没 有 价 值 事 例( 如 不 做 任 何 事 的 循 环) 并 将 其 优 化 出 去 的 编 译
 器。 这
种 编 译 器 能 够 生 成 非 常 快 的 基 准 时 序, 并 且 不 在 程 序 生 成 过 程
 中 反
映。 作 为 一 个 编 译 器, 对 这 些 怪 异 的 事 例 不 进 行 优 化, 从 这 方 面
 来
看,HotSpot 并 不 见 得 高 明, 即 使 它 在 真 实 世 界 中 表 现 良 好。(Sun 最
 近 对
此 进 行 了 论 证, 他 们 设 计 了 一 个 编 译 器, 来 专 门“ 优 化” 这 些 基
 准, 直
至 使 程 序 变 成 在 基 本 的 零 次 内 运 行 的 几 乎 什 么 都 没 有 了 的 程 序
。 尽 管
他 们 的 尝 试 在 民 意 测 验 中 遭 到 反 对, 它 还 是 表 明, 这 种 基 准 对
性 能 的
提 高 并 不 十 分 值 得 信 赖。)

---- 对 于 任 何 增 强 性 能 的 技 术 来 说, 最 基 础 的 问 题 是: 它 对 你 的
 应 用 程
序 倒 底 有 何 好 处 ? 在 大 多 数 的 普 通 应 用 程 序 中, 垃 圾 收 集 和 线
 程 同 步
都 会 发 生, 也 存 在 着 真 正 的 代 码 重 复,HotSpot 方 法 对 性 能 的 巨 大
 提 高 起
到 了 十 分 重 要 的 作 用。

---- HotSpot 与 本 地 代 码 的 比 较

---- 本 文 中, 我 们 一 直 将 动 态 编 译 和 其 它 处 理Java 代 码 的 方 法 进
 行 比
较。 但 这 种 比 较 仅 限 于 将 一 种Java 形 式 和 另 一 种Java 进 行 比 较。 有
 些 怀
疑 主 义 者 会 忍 不 住 发 问:“ 就 算 你 说 的 都 对, 但 它 与 我 最 好 的 编
 译 器
相 比, 究 竟 如 何 呢 ?” 对 此 我 的 回 答 是: 现 在, 这 一 技 术 已 经 可
 以 和 本
地 编 译 器 相 媲 美, 而 将 来 它 更 可 能 青 出 于 蓝。Sun 将 其 目 标 定 位
在 所 取
得 的 性 能 能 够 与 优 化 后 的C 程 序 相 抗 衡 这 一 级 别 上。 随 着 时 间 的
 流
逝,Sun 确 信 能 够 达 到 这 一 目 标。

---- 在 目 前, 好 的JIT 编 译 器 已 经 赶 上 或 超 过 了 面 向 对 象 程 序 的
C++ 静 态
编 译 器, 这 点 可 从“ 性 能 测 试 表 明,Java 和C++ 一 样
快”(http://www.javaworld.com/jw-02-1998/jw-02-jperf.html) 这 篇 文 章 中 看 到

而HotSpot 比JIT 还 快。 尽 管 它 目 前 还 不 能 赶 上C 语 言 的 性 能, 但 正 向
 这 个
目 标 逼 进。

---- 请 注 意:C++ 可 以 象Java 一 样 用 于 生 成 面 向 对 象 的 程 序, 也 可
以 象C
语 言 一 样, 创 建 运 行 速 度 极 快 的 非 面 向 对 象 代 码。 现 在,Java 可
以 和 面
向 对 象 的 C++ 程 序 相 匹 敌。 但 是C++ 程 序 可 以 被 优 化 成C 风 格 的 代
码,
提 高 其 性 能, 但 Java 不 允 许 这 一 功 能。 因 为 这 会 使 代 码 难 以 维 护
, 虽 然
它 能 运 行 得 很 快。

-

--
☆ 来源:.深大荔园晨风 bbs.szu.edu.cn.[FROM: www-post@linux.szu.e]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店