假设我有一个如下的 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/