首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Switch语句中case的顺序会改变性能吗?

Switch语句中case的顺序会改变性能吗?
EN

Stack Overflow用户
提问于 2010-05-12 11:39:36
回答 3查看 11K关注 0票数 22

假设我有一个switch语句,如下所示

代码语言:javascript
复制
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语句的顺序,并使其如下所示:

代码语言:javascript
复制
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语句,这会是一个实质性的改进吗?或者,如果没有,我如何使用我的频率知识来提高性能?

EN

回答 3

Stack Overflow用户

发布于 2010-05-12 11:54:07

这取决于编译器如何实现switch语句。

首先,您不能随意改变顺序;如果在类C语言(C、C++、C#、Java等)中有一个case块,并且该case块不会在中断中终止,则不能重新排列case,因为缺少break意味着编译器必须实现到下一个case。如果我们忽略这个特殊的情况,你可以改变其余的情况。

如果用例的数量很少,编译器可以通过比较序列来实现用例测试。如果案例的数量适中,它可以从案例构建平衡二叉树。如果案例数很大,如果切换值来自密集集合,则大多数编译器会在切换值上实现索引分支。如果事例值集合的部分是密集的,而部分不是,则编译器可以使用二叉树将事例划分成组以选择哪个密集集合,并在密集集合内进行索引跳转。(实际上,从技术上讲,编译器可以执行任何将控制传递给适当情况的操作,但大多数情况下都是上述情况之一)。

您可以看到,顺序可能很重要,也可能不重要,这取决于编译器如何实现切换。对于大多数优秀的编译器来说,这并不重要。

票数 3
EN

Stack Overflow用户

发布于 2010-05-12 11:45:30

对于相对较小的一组值,它们具有相同的性能。我以前试过检查C程序的汇编代码,编译器会根据switch语句中的所有值创建一个跳转表。

但是如果case值太多,可以肯定它们会退化到if else if,所以把case 'E‘放在最上面肯定会加快速度。

它也是C#中的applicable,C#还为具有较小集合的切换语句生成跳转表,尽管只有相邻值。所以它是O(1),即使第一个值不匹配,也不会有多个测试。

票数 2
EN

Stack Overflow用户

发布于 2010-05-12 11:42:04

我认为switch case的方法是从上到下遍历所有的案例,以找到一些匹配的案例。如果匹配,它就会停止。

因此,如果您更改了频率情况的优先级,答案是肯定的,它可以以某种方式帮助提高性能。但我相信这不会有太大帮助。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2815983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档