优化调用函数指针数组

时间:2019-07-05 18:29:03

标签: c++ c optimization jit

我有以下循环,该循环调用数组中的所有函数指针:

for(auto f : program) {
   f();
}

我想对此进行优化。到目前为止,我已经尝试了两种方法:

  1. 尾递归
  2. 准时执行线程代码

这是完整的测试代码:https://coliru.stacked-crooked.com/a/d639f024b1222c54

我的机器(iMac Pro 8核)上的计时结果是:

naive: 0.530534
tail recursion: 0.265192
JIT threaded: 0.125106

当然,必须修改所有函数以方便尾部递归,但这没关系。就代码清洁度而言,令人不愉快的是将所有内容放到一个函数中,并使用类似计算goto的方法(实际上,我也曾尝试过,计算goto的速度仅比机器上的尾递归略快。)< / p>

在没有JITting的情况下,我能比在尾部递归上做得更好吗?(在iOS上,不允许JITting)

请注意,这些功能无法重新排序。

1 个答案:

答案 0 :(得分:1)

是的。实际上,我们无需JITting就可以击败线程代码​​。

测试代码包含100个可能的功能。我编写了一个小程序来为100x100个函数数组生成代码,这些函数调用这100个函数对。优化器将原始的100个成对插入。我们现在有:

naive: 0.534162
tail recursion: 0.269307
JIT threaded: 0.124608
pairs: 0.085922

通过分析函数调用的公共序列,而不是生成所有可能的对,可以将该技术推广到现实世界中。

这可以与尾部递归结合使用,以实现更快的调度。