c# - Switch 语句中的大小写顺序是否会影响性能?

标签 c# performance micro-optimization switch-statement

假设我有一个如下的 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 语句,这会是一个实质性的改进吗?或者,如果没有,我该如何使用我的频率知识来提高性能?

最佳答案

没有那么多,你应该担心。这当然不是可以预测的事情。

对于字符串大小写标签,编译器实际上使用一个内部哈希表将字符串映射到跳转表中的索引。所以操作实际上是 O(1) - 独立于标签的数量。

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

不过,一般来说,您编写的代码应该您可以阅读,而不是让编译器可以生成“更快”的代码。

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

关于c# - Switch 语句中的大小写顺序是否会影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815983/

相关文章:

C#泛型重构

c# - 将字符串文字分配给 char*

python - count() 的奇怪执行时间

python - 为什么 "if not (a and b)"比 "if not a or not b"快?

c# - iTextSharp 在单个单元格中添加文本和条形码?

c# - 如何从 OneDrive 下载文件

MySQL LEFT JOIN 两个嵌套表的性能

mysql循环访问数据库的性能

java - 这两个Java段的性能有什么区别吗?