分支中的Visual Studio性能优化

时间:2012-10-08 08:40:04

标签: visual-studio-2010 performance c#-4.0 optimization compiler-optimization

考虑以下

while(true)
{
    if(x>5)
     // Run function A
    else
     // Run function B
}

如果x总是小于5,那么visual studio编译器会进行任何优化吗?即从不检查x是否大于5并始终运行函数B

1 个答案:

答案 0 :(得分:4)

这取决于编译器是否“知道”x总是小于5

是的,几乎所有现代编译器都能够删除分支。但是编译器需要能够证明分支总是向一个方向发展。


以下是可以优化的示例:

int x = 1;

if (x > 5)
    printf("Hello\n");
else
    printf("World\n");

反汇编是:

    sub rsp, 40                 ; 00000028H
    lea rcx, OFFSET FLAT:??_C@_06DKJADKFF@World?6?$AA@
    call    QWORD PTR __imp_printf

x = 1可证明小于5。所以编译器能够删除分支。


但是在这个例子中,即使你总是输入少于5,编译器也不知道。它必须承担任何输入。

int x;
cin >> x;

if (x > 5)
    printf("Hello\n");
else
    printf("World\n");

反汇编是:

    cmp DWORD PTR x$[rsp], 5
    lea rcx, OFFSET FLAT:??_C@_06NJBIDDBG@Hello?6?$AA@
    jg  SHORT $LN5@main
    lea rcx, OFFSET FLAT:??_C@_06DKJADKFF@World?6?$AA@
$LN5@main:
    call    QWORD PTR __imp_printf

分支停留。但请注意,它实际上将函数调用从分支中提升出来。所以它真正优化了代码到这样的东西:

const char *str = "Hello\n";

if (!(x > 5))
    str = "World\n";

printf(str);