一般建议
本书前几节讨论了 Rust 特定的技术。本节简要概述了一些一般性能原则。
只要避免明显的陷阱(例如使用非发布版本构建),Rust 代码通常运行速度快且占用内存少。特别是如果你习惯于动态类型语言如 Python 和 Ruby,或者带有垃圾回收器的静态类型语言如 Java 和 C#。
优化的代码通常比未优化的代码更复杂,编写起来需要更多的工作。因此,只有值得优化热点代码时才值得进行优化。
最大的性能改进通常来自于算法或数据结构的更改,而不是低级优化。 Example 1, Example 2.
编写能够与现代硬件良好配合的代码并不总是容易的,但值得努力。例如,尽量减少缓存未命中和分支预测错误。
大多数优化只会带来轻微的加速。虽然单个小的加速可能不明显,但如果你能做足够多的优化,它们的效果会累积起来。
不同的性能分析工具各有优势。最好使用多个工具。
当性能分析表明某个函数运行热点时,有两种常见的加速方法:(a)加快函数运行速度,和/或者(b)尽量减少调用次数。
消除愚蠢的减速往往比引入巧妙的加速更容易。
除非必要,避免计算。延迟/按需计算通常是明智的选择。 Example 1, Example 2.
一般复杂的情况往往可以通过乐观地检查比较简单的常见特殊情况来避免。 Example 1, Example 2, Example 3. 尤其是在小尺寸占主导地位的情况下,特别处理0、1或2个元素的集合往往是一种好办法。 Example 1, Example 2, Example 3, Example 4.
同样,在处理重复性数据时,通常可以使用一种简单的数据压缩形式,对常见的值使用紧凑的表示方式,然后对不常见的值进行回退到二级表。 Example 1, Example 2, Example 3.
当代码涉及多种情况时,测量各种情况的频率,并首先处理最常见的情况。
在涉及高局部性的查找时,将一个小缓存放在数据结构前面可能会带来好处。
优化的代码通常具有非显而易见的结构,这意味着解释性注释非常有价值,特别是那些参考了性能分析数据的注释。例如,“99% 的情况下,这个向量有 0 或 1 个元素,因此首先处理这些情况”这样的注释可以很有启发性。