【发布时间】:2019-11-16 08:49:48
【问题描述】:
我有以下循环调用数组中的所有函数指针:
for(auto f : program) {
f();
}
我想对此进行优化。到目前为止,我已经尝试了两种方法:
- 尾递归
- JITting 线程代码
这里是完整的测试代码:https://coliru.stacked-crooked.com/a/d639f024b1222c54
我的机器(iMac Pro 8-Core)上的计时结果是:
naive: 0.530534
tail recursion: 0.265192
JIT threaded: 0.125106
当然,所有函数都必须修改以方便尾递归,但这没关系。在代码清洁度方面不太令人愉快的是将所有内容放在一个函数中并使用计算 goto 之类的东西(实际上,我也尝试过,计算 goto 只比我机器上的尾递归快一点。)
我可以在没有 JITting 的情况下比尾递归做得更好吗?(在 iOS 上,不允许 JITting)
请注意,函数不能重新排序。
【问题讨论】:
-
您是否保证所有测试的内存访问模式相同?我想所有的缓存获取和分页都发生在第一次调用这些函数时,这会极大地影响结果。如果您最后测试天真,您的计时结果会发生很大变化吗?或者可能从您的计时结果中排除第一轮执行(因为第一轮将包括分页未命中和 CPU 缓存未命中。)
-
@Wyck 好点。在我的机器上,我使用 XCTest,每个测试运行 10 次。第一次运行稍慢,但不是特别重要。我怀疑这是因为每个测试都进行了 100m 的函数调用。
标签: c++ c optimization jit