c# – case标签的顺序对switch语句的效率有多大影响?

考虑:

if (condition1)
{
    // Code block 1
}
else
{
    // Code block 2
}

如果我知道condition1在大多数时间都是真实的,那么我应该编写逻辑,而不是:

if (!condition1)
{
    // Code block 2
}
else
{
    // Code block 1
}

因为我将避免跳转到第二个代码块的惩罚(注意:我对汇编语言的知识有限).这个想法是否继续转换语句和案例标签?

switch (myCaseValue)
{
    case Case1:
        // Code block 1
        break;

    case Case2:
        // Code block 2
        break;

    // etc.
}

如果我知道其中一种情况会更频繁地发生,我可以重新排列案例标签的顺序,以便更有效率吗?我是不是该?在我的代码中,我一直按照字母顺序排列案例标签,以便代码可读性,而不必考虑它.这是微观优化吗?

现代硬件的一些事实,如x86或x86_64:

>除了解码之外,无条件分支机构几乎没有额外的费用.如果你想要一个数字,这是大约四分之一钟的周期.
>正确预测的条件分支几乎没有额外费用.
>没有正确预测的条件分支具有等于处理器管线长度的惩罚,这大约是12-20个时钟,取决于硬件.
>预测机制非常复杂.可以很好地预测循环次数少(例如Core 2,最多64次).如果不太长(Core II上的IIRC 6),可以预测像“被拍摄的”一样的重复模式.

您可以阅读更多关于Agner Fogs优秀manual.的分支预测

Switch语句通常由编译器替换为跳转表.在大多数情况下,案件的顺序根本不会有所不同.还有间接跳跃的预测机制.

所以问题不在于你的跳跃是否更有可能被采用,如果它们是可以预测的,至少对于您打算运行代码的硬件来说,这是不可取的.这根本不是一个容易的问题.但是,如果您有分支依赖于随机(或伪随机)条件,则可以尝试将其重新构建为无枝语句.

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/1827406/how-much-does-the-order-of-case-labels-affect-the-efficiency-of-switch-statement

转载注明原文:c# – case标签的顺序对switch语句的效率有多大影响?