优化调用一系列功能指针



我有以下循环,该循环在数组中调用所有功能指针:

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

我想优化这个。到目前为止,我尝试了两种方法:

  1. 尾部递归
  2. jitting螺纹代码

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

我的计算机上的计时结果(iMac Pro 8核(为:

naive: 0.530534
tail recursion: 0.265192
JIT threaded: 0.125106

当然,必须对功能进行修改以促进尾部递归,但这还可以。在代码清洁方面,不太令人愉悦的是将所有内容都放在一个函数中并使用计算的goto(实际上我也尝试过,并且计算的goto仅比我的机器上的尾部递归稍快。(

我可以在不发抖的情况下比尾部递归做得更好吗?

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

是。

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

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

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

这可以与尾部递归结合起来,以更快地调度。

最新更新