Visual studio 将概要文件引导的编译报告到源代码

Visual studio 将概要文件引导的编译报告到源代码,visual-studio,optimization,gcc,compilation,branch-prediction,Visual Studio,Optimization,Gcc,Compilation,Branch Prediction,在这个问题中,我将重点介绍VisualStudio2012和GCC4.7 一方面,概要文件引导编译通过在运行时检测代码,然后在第二次编译期间使用此信息来优化分支预测。另一方面,许多编译器提供扩展来提示编译器最有可能采用哪一个分支:GCC提供\uuuuu内置\uexpect,visualstudio提供\uuuuuuuu假定 有没有办法提取(任一编译器的)概要文件引导信息,以便能够使用两个编译器扩展重写代码?目标是为愿意重新编译自己版本的二进制文件的人提供“优化”的源代码。您可以使用gcov提取此

在这个问题中,我将重点介绍VisualStudio2012和GCC4.7

一方面,概要文件引导编译通过在运行时检测代码,然后在第二次编译期间使用此信息来优化分支预测。另一方面,许多编译器提供扩展来提示编译器最有可能采用哪一个分支:GCC提供
\uuuuu内置\uexpect
,visualstudio提供
\uuuuuuuu假定


有没有办法提取(任一编译器的)概要文件引导信息,以便能够使用两个编译器扩展重写代码?目标是为愿意重新编译自己版本的二进制文件的人提供“优化”的源代码。

您可以使用
gcov
提取此信息

编译源代码,如:

gcc -ftest-coverage -fprofile-arcs x.c
运行可执行文件

./a.out
在源文件上运行
gcov-b
。选项
-b
告诉它生成分支概率信息

gcov -b x.c
gcov
将创建文本文件
x.c.gcov
,其中将包含所需信息,以下是一个示例:

        -:    5:int
function foo called 1 returned 100% blocks executed 100%
        1:    6:foo (unsigned int N)
        -:    7:{
        1:    8:  int i, s = 0;
        -:    9:
    10001:   10:  for (i = 0; i < N; ++i)
branch  0 taken 99%
branch  1 taken 1% (fallthrough)
        -:   11:    {
    10000:   12:      if ((rand () % 100) < 30)
call    0 returned 100%
branch  1 taken 30% (fallthrough)
branch  2 taken 70%
     3027:   13:        s++;
        -:   14:      else
     6973:   15:        s--;
        -:   16:    }
        -:   17:
        1:   18:  return s;
        -:   19:}
-:5:int
调用的函数foo 1返回100%执行的块100%
1:6:foo(无符号整数N)
-:    7:{
1:8:inti,s=0;
-:    9:
10001:10:for(i=0;i
注意,
\u假设
没有告诉编译器“这个表达式可能是真的”,它告诉编译器“这个表达式总是真的。”这有很大的区别。@JamesMcNellis我不知道!谢谢