在我的数值分析课程中,我学会了通过计算相对于问题大小所需的浮点运算(触发器)的数量来分析算法的效率。例如,在 Trefethen & Bau 关于数值线性代数的文章中,甚至还有翻牌数的 3D 外观图片。
现在流行说“触发器是免费的”,因为获取不在缓存中的任何内容的内存延迟比触发器的成本要大得多。但我们仍在教学生数失败,至少在数值分析课程中是这样。我们应该教他们计算内存访问次数吗?我们需要写新的教科书吗?或者内存访问是否过于特定于机器而无法花时间?触发器或内存访问是否是瓶颈的长期趋势是什么?
注意:下面的一些答案似乎在回答一个不同的问题,例如“我应该痴迷地重写我的实现以节省一些失败或提高缓存性能吗?” 但我要问的更多的是“根据算术运算或内存访问来估计算法复杂性是否更有用?”