【发布时间】:2014-12-02 02:20:47
【问题描述】:
我有一个反复运行的循环。该循环内的逻辑取决于程序所处的模式。为了提高性能,我认为可以初始化一个函数指针数组functionPtr [],这样就可以调用运行正确逻辑的functionPtrmode。循环将在许多周期内保持相同的模式(这个数字是未知的,但有数千个)。该程序仅在 intel x64 机器上运行,不需要可移植性。
我希望 CPU 会利用分支预测,但由于我的分支不是有条件的(在汇编级别上),但分支的位置确实取决于变量(functionPtr+mode)。 CPU 是否会尝试计算 functionPtr+mode 并在流水线中开始拉入这些指令?
【问题讨论】:
-
与分支预测无关,但应该没问题 - 即使是间接函数调用也不应该出现管道停顿。
-
我看到你正在使用 c++。你不能创建两个继承自同一个接口的类,然后根据模式实例化正确的类吗?
-
如果只有少数情况,您可以将循环中的函数作为模板参数。在运行时选择(例如 switch 语句),一个包含循环的模板函数。请注意,这会增加代码大小。
-
@Vincent,我认为这有同样的问题,如果你有 foo[mode].run() 那么你仍然有一个指向 foo[mode] 的指针来计算和一个函数来调用。在我的情况下,无论哪种方式 run() 调用中所需的信息都会修改将在下一次 run() 调用中使用的变量,即使是不同的模式,所以将其保留在一个类中是有意义的。
-
@Neil,当模式在整个循环中不可预知地切换时,这听起来好像不起作用。
标签: c++ function-pointers branch-prediction