4

在 ANSI C 程序中,以某种随机顺序对 10 个具有相同调用列表和返回值的函数进行 50 到 500 次连续调用,这些调用将被执行数千甚至数百万次。函数调用的实际数量及其执行顺序由启动时的随机输入数据确定,但不会在执行间隔内发生变化。

关于 switch 语句或函数指针数组是否会更快似乎有些混淆。虽然函数调用的初始数量及其调用顺序最初在设置时是随机的,但它们将在整个程序执行过程中保持不变。这种情况下是否有任何特性可以使一种方法比另一种更好,并且是否有特定的编译器设置或指令可以帮助编译器识别这种特殊情况以提高一种方法或另一种方法的性能?在 XCode 中使用 GCC 编译器。

4

2 回答 2

3

如果你的功能比 switch 耗时长,优化 switch 也没关系。测量,测量,测量。

如果与开关相比,这些函数需要更短的时间,您可以在通过数组的间接函数调用的几乎确定的管道中断之间进行选择(CPU 预测这些非常糟糕[但请阅读您的汇编语言手册关于间接跳转]),或者(如果编码良好)在 10 个左右的函数中进行二分搜索(3-4 个分支,其中任何一个都会导致管道中断)。CPU 中的分支预测器将尝试根据实际统计信息猜测正确的分支方向;对于常见情况,它可能会将误预测率降至零。如果顺序只是“有点”随机,您可以确定哪些调用频率最高,并构建一个区分网络(霍夫曼树),将选择偏向最高概率函数,然后是下一个,等等,

我怀疑如果您将函数体内联到循环内的开关中,您会做得更好。做得对,您将不会有任何显式的参数传递,这将有助于缩短执行时间。

于 2012-06-03T23:03:54.187 回答
0

这取决于您的编译器、体系结构,可能还取决于调用签名。这听起来像是即时编译的一个很好的用例(生成一些源代码,调用gccld在其上,dlopen生成的 .so 文件dlsym,和调用)。

于 2012-06-03T22:33:01.557 回答