Switch语句中的大小写顺序是否会改变性能?

Bip*_*pul 19 c# performance switch-statement micro-optimization

假设我有一个如下的switch语句

switch(alphabet) {

    case "f":
        //do something
        break;

    case "c":
        //do something
        break;

    case "a":
        //do something
        break;

    case "e":
        //do something
        break;

}
Run Code Online (Sandbox Code Playgroud)

现在假设我知道Alphabete 的频率最高,然后分别是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;
}
Run Code Online (Sandbox Code Playgroud)

第二个switch陈述会比第一个switch陈述更快吗?如果是的话,如果在我的计划中,我需要switch多次称这个声明,这会是一个实质性的改进吗?或者,如果没有,我如何使用我的频率知识来提高性能?

Dea*_*ing 21

并不是说你应该担心.这当然不是可以预测的东西.

对于字符串大小写标签,编译器实际上使用内部哈希表将字符串映射到跳转表中的索引.因此操作实际上是O(1) - 与标签数量无关.

对于整数标签,我相信生成的实际代码取决于标签的数量以及数字是否连续(或"几乎"连续).如果它们是连续的(1,2,3,4 ......),那么它们将被转换成跳转表.如果有很多,那么将使用Hashtable +跳转表(与字符串一样).如果只有少数标签,并且它们不是立即转换为跳转表的表,那么只有那时才会转换成一系列if..then..else语句.

但是,一般情况下,您应该编写代码以便可以读取它,而不是让编译器生成"更快"的代码.

(注意我上面的描述是关于C#编译器如何在内部工作的实现细节:你不应该依赖它总是这样工作 - 事实上,它甚至可能不会像现在这样工作,但至少它是一般的想法).

  • 来自我的+1.如果perf真的是**问题,请考虑使用更接近金属的语言. (3认同)
  • 什么是-1的所有? (2认同)