我有以下循环,该循环调用数组中的所有函数指针:
for(auto f : program) {
f();
}
我想对此进行优化。到目前为止,我已经尝试了两种方法:
这是完整的测试代码: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)
请注意,这些功能无法重新排序。
答案 0 :(得分:1)
是的。实际上,我们无需JITting就可以击败线程代码。
测试代码包含100个可能的功能。我编写了一个小程序来为100x100个函数数组生成代码,这些函数调用这100个函数对。优化器将原始的100个成对插入。我们现在有:
naive: 0.534162
tail recursion: 0.269307
JIT threaded: 0.124608
pairs: 0.085922
通过分析函数调用的公共序列,而不是生成所有可能的对,可以将该技术推广到现实世界中。
这可以与尾部递归结合使用,以实现更快的调度。