假设我有一个switch语句,如下所示
switch(alphabet) {
case "f":
//do something
break;
case "c":
//do something
break;
case "a":
//do something
break;
case "e":
//do something
break;
}
现在假设我知道Alphabet
e的频率最高,然后分别是a,c和f。因此,我刚刚重组了case
语句的顺序,并使其如下所示:
switch(alphabet) {
case "e":
//do something
break;
case "a":
//do something
break;
case "c":
//do something
break;
case "f":
//do something
break;
}
第二条switch
语句会比第一条switch
语句快吗?如果是,并且如果在我的程序中我需要多次调用这个switch
语句,这会是一个实质性的改进吗?或者,如果没有,我如何使用我的频率知识来提高性能?
发布于 2010-05-12 11:54:07
这取决于编译器如何实现switch语句。
首先,您不能随意改变顺序;如果在类C语言(C、C++、C#、Java等)中有一个case块,并且该case块不会在中断中终止,则不能重新排列case,因为缺少break意味着编译器必须实现到下一个case。如果我们忽略这个特殊的情况,你可以改变其余的情况。
如果用例的数量很少,编译器可以通过比较序列来实现用例测试。如果案例的数量适中,它可以从案例构建平衡二叉树。如果案例数很大,如果切换值来自密集集合,则大多数编译器会在切换值上实现索引分支。如果事例值集合的部分是密集的,而部分不是,则编译器可以使用二叉树将事例划分成组以选择哪个密集集合,并在密集集合内进行索引跳转。(实际上,从技术上讲,编译器可以执行任何将控制传递给适当情况的操作,但大多数情况下都是上述情况之一)。
您可以看到,顺序可能很重要,也可能不重要,这取决于编译器如何实现切换。对于大多数优秀的编译器来说,这并不重要。
发布于 2010-05-12 11:45:30
对于相对较小的一组值,它们具有相同的性能。我以前试过检查C程序的汇编代码,编译器会根据switch语句中的所有值创建一个跳转表。
但是如果case值太多,可以肯定它们会退化到if
else if
,所以把case 'E‘放在最上面肯定会加快速度。
它也是C#中的applicable,C#还为具有较小集合的切换语句生成跳转表,尽管只有相邻值。所以它是O(1),即使第一个值不匹配,也不会有多个测试。
发布于 2010-05-12 11:42:04
我认为switch case的方法是从上到下遍历所有的案例,以找到一些匹配的案例。如果匹配,它就会停止。
因此,如果您更改了频率情况的优先级,答案是肯定的,它可以以某种方式帮助提高性能。但我相信这不会有太大帮助。
https://stackoverflow.com/questions/2815983
复制相似问题