跳转到内容

优化代码速度/大纲

来自维基教科书,开放的书籍,开放的世界

此作品根据

  1. Creative Commons 署名许可证 2.5 版 - 或您选择的任何更高版本。
  2. GNU 自由文档许可证 1.2 版 - 或您选择的任何更高版本。

请保持这种方式。如果您不喜欢任何或所有许可证 - 请随时将其分叉并拥有不同的派生许可证。(在适当接受任一许可证的条款作为起点的同时)。

作者:User:Shlomif

优化代码速度 - 大纲

[编辑 | 编辑源代码]
  • 介绍
    • 在什么类型的程序中需要优化?
    • 何时优化?
    • 何时不优化?
  • 优化指南
    • 确保您有自动化测试,并且覆盖率良好。(这样在过程中就不会出现问题,并且可以为分析器提供素材)。
    • 确保您的代码足够模块化。
    • 使用分析器进行分析。
    • 代码审查。
  • 复杂度优化顺序
    • 解释
    • 什么是复杂度?
    • 降低复杂度
      • 例子
        • 查找应明显小于 O(n)
        • 使用平衡二叉树代替排序数组。
        • 使用哈希表代替平衡二叉树
        • 计数排序/基数排序
        • Joel on Software 的 Back to Basics' Shlemiel's the Painter 综合症 - O(n^2) 而不是 O(n)
      • 证明算法是最低复杂度的。
    • 复杂度优化逆序 - 有时更低复杂度的算法会有更大的因子
      • 中位数 O(N) 算法 - 通常 O(N*log(N)) 排序会更可取。
      • 对大型对象进行计数排序。
  • 因子优化
    • 什么是因子优化?
    • 因子优化的动机
    • 例子
      • 使用指向结构体的指针而不是结构体数组
      • 减少内存消耗。
        • 关于内存/速度权衡“神话”的说明。
      • 并行化
        • 关于阿姆达尔定律的说明。
      • 将最常用的变量放在结构体的开头。(Linux 内核)
      • 写时复制
      • 缓存
      • 完全避免复制
      • 内联函数
      • 施瓦茨变换
    • 呼吁建立优化目录
  • 更改依赖项
    1. 使用不同的库或您自己的自编码例程。
    2. 切换到更快的语言(或在不同的语言中优化关键代码)。语言层次结构
      • 汇编器 > C >= O'Caml > Java, .NET >> Perl, PHP > Python, Ruby, Tcl
  • 通过减少功能集来优化
    • 更少的代码 -> 更少的内存消耗 -> 更快的代码。
    • 更少的功能 -> 更少的 if 语句和内容 -> 更快的代码。
      • 违反“0, 1, 无限”定律。
    • 通过在安全性上妥协
      • 更少的健全性检查、输入检查等会导致更快的代码。
        • 不包含大量检查 malloc() 失败等错误的代码运行速度更快,因为它没有很多错误处理。
          • “这里有巨龙”。
  • 结论

考虑添加的资源

[编辑 | 编辑源代码]
华夏公益教科书