gpt4 book ai didi

c - 对于 ANSI C 中的特殊应用,case 语句或函数指针数组是否更快?

转载 作者:太空狗 更新时间:2023-10-29 15:36:31 26 4
gpt4 key购买 nike

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

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

最佳答案

如果你的函数比switch耗时长,你优化switch也没关系。衡量、衡量、衡量。

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

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

关于c - 对于 ANSI C 中的特殊应用,case 语句或函数指针数组是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10874436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com