我注意到这个问题的代码中有一个有趣的行为,它也来自 Agner Fog 在Optimizing software in C++ 中,它简化了数据访问和存储在缓存中的方式(缓存关联性)。解释对我来说很清楚,但后来有人对volatile
......如果我们volatile
在矩阵声明中添加限定符:volatile int mat[MATSIZE][MATSIZE];
值的运行时间512
急剧减少:2144 → 1562 μs。
正如我们所知volatile
,当程序的 POV 看起来没有必要时,编译器会阻止编译器缓存值(在 CPU 寄存器中)并优化对该值的访问。
一种可能的版本假设计算过程仅发生在 RAM 中,并且在 的情况下不使用 cpu 缓存volatile
。但另一方面, value 的运行时间513
再次小于for 512
: 1490 μs
...
不幸的是,我无法确认 volatile 版本运行得更快。我对 volatile 和非 volatile 版本都做了测试,两者的时间对比见下图。在衡量性能以优化代码时,采取几个步骤(不仅仅是一两个,而是数千个)并采用模式(https://en.wikipedia.org/wiki/Mode_(statistics ) ) 根据 Alexandrescu 的 Fastware 收集的数据。
有各种高峰和深谷,但从图表上看,您无法得出波动率更快的结论。
确实,编译器生成的代码是不同的,但没有到这种程度,你可以在https://godbolt.org/g/ILw3tg查看
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句