我正在构建一个小型解释器,所以我想测试一下if、switch和函数指针之间的速度比较。使用19个else if的if语句比有20个case的switch稍微快一些,而函数指针(一个包含20个函数指针的数组)比前两者要慢得多... 我原本期望结果完全相反,有人能解释一下吗?
对于现代处理器来说,这在很大程度上取决于分支预测。尽管一个switch语句可以被实现为一个跳转表,在执行代码的任何分支上花费相同的时间,但它通常是非常不可预测的 - 真的; 分支预测器经常不能很好地预测哪个分支会被选择,这意味着存在非常大的流水线气泡(通常约为15个浪费周期)。
if语句可能会进行更多的比较,但其中大部分分支几乎每次都以相同的方式被选中,因此分支预测器可以更准确地预测它们的结果。
指向函数的指针也可能非常不可预测。更糟糕的是,直到最近,大多数处理器几乎根本没有尝试过。只有最近的BTB(分支目标缓冲区)实现足够强大,才能真正尝试通过指针来预测分支的目标。在旧的处理器上,指向函数的指针在速度比较中通常表现得很差。
case…break
基本块的switch
可以转换为可通过不超过log(n)个分支到达的(n)个基本块,而一系列if…else if
最多需要(n)个分支,除非编译器非常聪明。 OP指出switch
比else if
快。@STing:函数调用是一类分支指令,您可以声明一个静态函数指针数组(在OP的情况下很可能)来分配它们而无需分支,甚至可能根本不调用用户空间代码。 - Potatoswatter