Zan*_*ynx 21
由于现代CPU的工作原理,通过指针间接可能要慢得多.但它与运行时内存没什么关系.
相反,速度受预测和缓存的影响.
当指针未被改变或以可预测的方式改变时(例如,在循环中递增或递减4),预测很容易.这允许CPU基本上在实际代码执行之前运行,找出指针值将是什么,并将该地址加载到缓存中.当指针值由像哈希函数这样的复杂表达式构建时,预测变得不可能.
缓存开始起作用,因为指针可能指向不在缓存中的内存,并且必须获取它.如果预测有效,则最小化,但如果预测不可能,那么在最坏的情况下,您可能会产生双重影响:指针不在缓存中,指针目标也不在缓存中.在最糟糕的情况下,CPU将停止两次.
如果指针用于函数指针,则CPU的分支预测器开始起作用.在C++虚拟表中,函数值都是常量,预测器很容易.当执行通过间接跳转时,CPU将准备好运行代码并在管道中运行.但是,如果它是一个不可预测的函数指针,性能影响可能会很大,因为需要刷新管道,每次跳转会浪费20-40个CPU周期.
| 归档时间: |
|
| 查看次数: |
3036 次 |
| 最近记录: |