优化代码速度/大纲
外观
< 优化代码速度
此作品根据
- Creative Commons 署名许可证 2.5 版 - 或您选择的任何更高版本。
- 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 内核)
- 写时复制
- 缓存
- 完全避免复制
- 内联函数
- 施瓦茨变换
- 呼吁建立优化目录
- 更改依赖项
- 使用不同的库或您自己的自编码例程。
- 切换到更快的语言(或在不同的语言中优化关键代码)。语言层次结构
- 汇编器 > C >= O'Caml > Java, .NET >> Perl, PHP > Python, Ruby, Tcl
- 通过减少功能集来优化
- 更少的代码 -> 更少的内存消耗 -> 更快的代码。
- 更少的功能 -> 更少的 if 语句和内容 -> 更快的代码。
- 违反“0, 1, 无限”定律。
- 通过在安全性上妥协
- 更少的健全性检查、输入检查等会导致更快的代码。
- 不包含大量检查 malloc() 失败等错误的代码运行速度更快,因为它没有很多错误处理。
- “这里有巨龙”。
- 不包含大量检查 malloc() 失败等错误的代码运行速度更快,因为它没有很多错误处理。
- 更少的健全性检查、输入检查等会导致更快的代码。
- 结论
- Eric Sink - 为什么 Git 如此快?
- 如何编写快速代码?(通过减少工作量)
- Ulrich Drepper - “每个程序员都应该了解的内存” - 第 1 部分,包含指向其他部分的链接。
- “Shavin' Another Second” - 优化 File-Find-Object Perl 模块
- Devel::NYTProf 演示 - 概述了有效的分析方法。