Visual studio 2010 分支中的visualstudio性能优化

Visual studio 2010 分支中的visualstudio性能优化,visual-studio-2010,performance,c#-4.0,optimization,compiler-optimization,Visual Studio 2010,Performance,C# 4.0,Optimization,Compiler Optimization,考虑以下几点 while(true) { if(x>5) // Run function A else // Run function B } 如果x总是小于5,VisualStudio编译器会进行任何优化吗?i、 e.like never检查x是否大于5,并始终运行函数B,这取决于编译器是否“知道”x始终小于5 是的,几乎所有现代编译器都能够删除分支。但是编译器需要能够证明分支总是朝着一个方向 下面是一个可以优化的示例: int x = 1; i

考虑以下几点

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

如果x总是小于5,VisualStudio编译器会进行任何优化吗?i、 e.like never检查x是否大于5,并始终运行函数B,这取决于编译器是否“知道”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
    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
x=1
可证明小于
5
。因此编译器能够删除分支


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

int x;
cin >> x;

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
    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);

这取决于编译器是否“知道”
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
    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
x=1
可证明小于
5
。因此编译器能够删除分支


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

int x;
cin >> x;

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
    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);

进行优化的是编译器,而不是VisualStudio;它真的这样做了吗?是否有办法确认?是-检查拆解情况。此外,优化这将取决于变量
x
is的类型:常量可能会导致检查优化,但如果
x
是覆盖
运算符>
的复杂类型,则可能不会。请记住,优化依赖于编译器标志,而调试的编译器标志是关闭的,因此您要么没有优化,要么得到最小优化。我如何检查反汇编?此外,CPU也会这样做。它能够“记住”if语句的哪个部分执行得更频繁。然后它将相应地优化代码执行。是编译器进行优化,而不是visual studio。我的意思是说VS编译器;它真的这样做了吗?是否有办法确认?是-检查拆解情况。此外,优化这将取决于变量
x
is的类型:常量可能会导致检查优化,但如果
x
是覆盖
运算符>
的复杂类型,则可能不会。请记住,优化依赖于编译器标志,而调试的编译器标志是关闭的,因此您要么没有优化,要么得到最小优化。我如何检查反汇编?此外,CPU也会这样做。它能够“记住”if语句的哪个部分执行得更频繁。然后它将相应地优化代码执行。谢谢。。。如果我正在从gui或命令行读取一个值,有没有办法向编译器证明从gui或命令行读取的值在过程结束之前永远不会更改?我误解了您的评论。所以这里有一个更新:不幸的是,不,如果没有代码重复,您将无法避免分支。但在任何情况下,分支机构都将始终以相同的方式运行,因此它几乎是免费的,因为。谢谢。。。如果我正在从gui或命令行读取一个值,有没有办法向编译器证明从gui或命令行读取的值在过程结束之前永远不会更改?我误解了您的评论。所以这里有一个更新:不幸的是,不,如果没有代码重复,您将无法避免分支。但在任何情况下,分支机构都将始终以相同的方式运行,因此它几乎是免费的。