10.1 编译时计算
如果程序中包含不依赖输入的计算,那么这些计算就可以提起在编译时计算而不是在运行时计算。
C++14标准提供了constexpr函数,C++17标准通过了if constexpr提供编译时分支。
10.2 编译器内建函数
可以强制编译器产生专门的汇编指令而不用编写底层的汇编语言,即编译器内建函数。一定要记住使用编译器内建函数的开发者必须自己处理安全方面的问题。
10.3 缓存预热
一些应用负载中时延最敏感部分的代码执行频率最低,导致关键代码和数据因为老化而被换出缓存。高频交易就是此类,摄取市场数据的代码路径最常被执行,而执行购买指令的代码路径很少被执行。缓存预热通过周期性运行时延敏感型代码来确保让它保存在缓存中,同时保证不会跟随任何不必要的动摇。
10.4 减少慢速浮点运算
对于非规范的数值进行运算,很容易就会变得非常慢。
通过专用的宏可以在代码层面禁用非规范浮点数。
10.5 系统调优
系统固件、操作系统或内核让我们优化付之一炬,因为这类中断持续10ms~100ms。从红帽子指导手册可以找到x86系统的提示和建议来消除或显著减少来自系统BIOS、Linux内核和设备驱动程序等资源的缓存干扰以及许多其他应用干扰来源。
大多数开箱即用的平台都被配置为具有最佳吞吐量,同时尽可能地节省功耗。但是有些行业关心时延。此时就要牺牲总吞吐量或者消耗更多能源了。
关闭处理器的睡眠状态让其做好立即响应的准备。另一个是缓存锁定,即将部分CPU缓存预留给特定的数据集,这有助于优化应用程序中的内存延迟。