但 是 事 实 往 往 并 非 如 此 ,很 多 时 候 ,一 个 程 序 的 速 度 在 框 架 设 计 完 成 时 大 致 已 经 确 定 了 ,而 并 非 是 因 为 采 用 了 C++语 言 才 使 其 速 度 没 有 达 到 预 期 的 目 标 。因 此 当 一 个 程 序 的 性 能 需 要提 高 时 , 首 先 需 要 做 的 是 用 性 能 检 测 工 具 对 其 运 行 的 时 间 分 布 进 行 一 个 准 确 的 测 量 , 找 出 关键 路 径 和 真 正 的 瓶 颈 所 在 , 然 后 针 对 瓶 颈 进 行 分 析 和 优 化 , 而 不 是 一 味 盲 目 地 将 性 能 低 劣 归咎 于 所 采 用 的 语 言 。 事 实 上 , 如 果 框 架 设 计 不 做 修 改 , 即 使 用C 语 言 或 者 汇 编 语 言 重 新 改写 , 也 并 不 能 保 证 提 高 总 体 性 能 。 因 此 当 遇 到 性 能 问 题 时 , 首 先 检 查 和 反 思 程 序 的 总 体 框 架 。 然 后 用 性 能 检 测 工 具 对 其 实际运 行 做 准 确 地 测 量 , 再针 对 瓶 颈 进 行 分 析 和 优 化 , 这才 是 正 确 的 思 路 。 但 不 可否认的 是 ,确 实 有 一 些操作或 者 C++的 一 些语 言 特性 比其 他因 素更容易成 为 程 序的 瓶 颈 , 一 般公认的 有 如 下因 素。 (1)缺页:如 第四章中所 述, 缺页往 往 意味 着需 要 访问 外部存储。 因 为 外部存储访问相对 于 访问 内存或 者 代码执行 , 有 数量 级的 差别。 因 此 只要 有 可能 , 应该尽量 想办法减少缺页。 (2)从堆中动态申请和 释放内存:如 C 语 言 中的 malloc/free 和 C++语 言 中的 new /delete操作非 常耗时 , 因 此 要 尽可能 优 先 考虑从线程 栈中获得内存。 优 先 考虑栈而 减少从动态堆中申请内存, 不 仅仅是 因 为 在 堆中开辟内存比在 栈中要 慢很 多 , 而 且还与“尽量 减少缺页”这一宗旨有 关 。 当 执行 程 序 时 , 当 前栈帧空间 所 在 的 内存页肯定 在 物理内存中, 因 此 程 序 代码对其 中变量 的 存取不 会引起缺页;相反 , 从堆中生成 的 对 象, ...