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#编译器如何在内部工作的实现细节:你不应该依赖它总是这样工作 - 事实上,它甚至可能不会像现在这样工作,但至少它是一般的想法).
| 归档时间: |
|
| 查看次数: |
8113 次 |
| 最近记录: |