Jon*_*gel 14 c c# c++ performance conditional-statements
考虑:
if (condition1)
{
// Code block 1
}
else
{
// Code block 2
}
Run Code Online (Sandbox Code Playgroud)
如果我知道这condition1
将是true
大部分时间,那么我应该将逻辑编写为编写,而不是:
if (!condition1)
{
// Code block 2
}
else
{
// Code block 1
}
Run Code Online (Sandbox Code Playgroud)
因为我将避免对jump
第二个代码块的惩罚(注意:我对汇编语言的了解有限).这个想法是否继续switch
发表声明和case
标签?
switch (myCaseValue)
{
case Case1:
// Code block 1
break;
case Case2:
// Code block 2
break;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
如果我知道其中一个案例会更频繁发生,我可以重新排列case
标签的顺序,以便更有效吗?我是不是该?在我的代码中,我一直在按字母顺序排列案例标签以获得代码可读性,而没有真正考虑它.这是微优化吗?
Gun*_*iez 33
现代硬件如x86或x86_64的一些事实:
您可以在Agner Fogs优秀手册中阅读有关分支预测的更多信息.
Switch语句通常由编译器的跳转表替换.在大多数情况下,案件的顺序根本不会产生任何影响.间接跳跃也有预测机制.
所以问题不在于你是否更有可能进行跳转,如果它们是可以预测的,至少对于你打算运行代码的硬件来说是这样.这根本不是一个简单的问题.但是如果你有一个取决于随机(或伪随机)条件的分支,你可以尝试将其重新表述为无分支语句.
这取决于.编译器将使用一组依赖于内部实现的标准来决定是将其实现switch
为if-like测试序列还是跳转表.例如,这可能取决于您的case
标签组的"紧凑" 程度.如果您的case
标签值形成"密集"集,则编译器可能更有可能使用跳转表,在这种情况下,case
标签的排序无关紧要.如果它决定使用类似于if-else测试的序列,则顺序可能很重要.
但请记住,主体switch
是一个大型语句,case
标签为该语句提供了多个入口点.出于这个原因,编译器case
在该语句中重新排列"子块"的能力(以及你的能力)可能是有限的.
归档时间: |
|
查看次数: |
2029 次 |
最近记录: |