c++ - 优化调用函数指针数组

标签 c++ c optimization jit

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

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

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

  1. 尾递归
  2. JIT 线程代码

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

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

naive: 0.530534
tail recursion: 0.265192
JIT threaded: 0.125106

当然所有的函数都必须修改以方便尾递归,但没关系。就代码整洁度而言,不太令人愉快的是将所有内容都放在一个函数中并使用诸如计算 goto 之类的东西(实际上我也尝试过,并且计算 goto 仅比我机器上的尾递归快一点。)

如果没有 JITting,我能比尾递归做得更好吗?(在 iOS 上,JITting 是不允许的)

请注意,函数不能重新排序。

最佳答案

是的。事实上,我们可以在没有 JIT 的情况下击败线程代码​​。

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

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

这种技术可以通过分析函数调用的常见序列而不是生成所有可能的对来推广到现实世界的案例。

这可以与尾递归相结合以实现更快的调度。

关于c++ - 优化调用函数指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56907800/

相关文章:

c++ - gdipluspath 为 cstddef 和 rpcndr.h 抛出不明确的字节

c - 如何调试合并排序?

c - SSE 中的乘减法

c - 如何在编译时常量中使用函数

c++ - 为什么 "partial RVO"没有执行?

python - 选择要求解的变量(使用 fsolve 查找 Python 根)

c++ - 使用 Dev C++ 执行 C++ 程序是否需要 iostream.h?

c++ - QTextStream::readLine(): 无效的返回值

c++ - 系统包括跨发行版不完全一致

java - 如何在我的应用程序中使用-assumenosideeffects class android.util.Log