快问.例如,使用一些大约1000个选项的大型案例:哪种是"最佳"方法?我并不是特意想要直接获得更快的结果.
switch (foo) {
case 0:
// code ...
break;
// One, two, skip a few...
case 1000:
// code ...
}
Run Code Online (Sandbox Code Playgroud)
或者分裂可能结果的东西,以便它可以快速找到正确的案例陈述.类似的:
if (foo < 101) {
if (foo < 51)
switch (foo) {}
else
switch (foo) {}
} else if (foo > 100 && foo < 201) {
// skipped for convenience
} else if (foo > 900) {
if (foo < 951)
switch (foo) {}
else
switch (foo) {}
}
Run Code Online (Sandbox Code Playgroud)
我想第二种方法对于较大的数字要快得多,但第一种方法似乎也可以轻松通过它,因为它不是经常检查语句.这些方法中有一种不赞成还是有更好的方法?这是针对C的,但我有兴趣知道它与其他语言的一致性.谢谢!
switch如果编译器使用跳转表实现它们,语句可以非常快,但这只能在特殊的序列中实现cases,并且可能不实际,它实际上取决于可能的cases.编译器可能会也可能不会使用跳转表,我确实找到了这个有趣的http://blog.jauu.net/2010/06/15/GCC-generated-Switch-Jump-Tables/.
JUMP表可以非常快,因为它只是计算偏移量并跳转到适当的地址.
GCC确实有-fno-jump-tables完全禁用它.
有时您可以使用函数指针数组和特殊索引构建自己的跳转表,这可以使您的代码速度极快但在所有情况下都不实用,想象您有一个开关,并且在每种情况下都会调用函数,可以构建一个函数指针数组,设置一个默认函数只是为了安全,然后你只需要fun_table[indice]();为我自己的虚拟机做一次这样的交换.