指针间接是否比条件更昂贵?

Phi*_*rad 5 c performance conditional pointers

指针间接(获取值)是否比条件更昂贵?

我观察到大多数不错的编译器可以在不同程度上预先计算指针间接 - 可能会删除大多数分支指令 - 但我感兴趣的是间接成本是否高于分支点的成本.生成的代码.

我希望如果指针引用的数据在运行时不在缓存中,可能会发生缓存刷新,但我没有任何数据可以支持.

有没有人对这个问题有可靠的数据(或合理的意见)?


编辑:几张海报指出,分支成本没有"一般情况":芯片之间的差异很大.

如果您碰巧知道一个值得注意的案例,其中分支将比缓存间接更便宜(有或没有分支预测),请提及它.

Mat*_*son 5

这在很大程度上取决于具体情况。

1 缓存(L1、L2、L3)中的数据多久一次,或者必须多久从 RAM 中获取一次?

从 RAM 中提取大约需要 10-40ns。当然,这将填充整个缓存行,因此如果您也使用接下来的几个字节,它绝对不会“受到伤害”。

2 它是什么处理器?

较早的 Intel Pentium4 以其长流水线阶段而闻名,并且需要 25-30 个时钟周期(2GHz 时约 15ns)才能从预测错误的分支中“恢复”。

3 条件的“可预测性”如何?

分支预测在现代处理器中确实有帮助,它们也可以很好地处理“不可预测”的分支,但它确实有点伤害。

4 缓存有多“忙”和“脏”?

如果您必须丢弃一些脏数据来填充缓存行,那么在“获取数据”时间之上还需要 15-50 纳秒。

间接本身将是一条快速指令,但当然,如果下一条指令使用紧随其后的数据,您可能无法立即执行该指令——即使数据在 L1 缓存中。

另一方面,如果天气好(预测准确、缓存中的目标、风向正确等),一个分支需要 3-7 个周期。

最后,当然,编译器通常很清楚什么最有效......;)

总而言之,很难肯定地说,判断在您的情况下什么更好的唯一方法是对替代解决方案进行基准测试。我认为间接内存访问比跳转快,但是如果没有看到您的源代码编译成什么代码,就很难说。