每个C指令有多少个asm指令?

Hen*_*aul 11 c assembly instructions

我意识到这个问题绝对不可能回答,但我只是在大概数字之后:

给定一个合理大小的C程序(数千行代码),平均来说,将生成多少ASM指令.换句话说,什么是真实的C-to-ASM指令比率?随意做出假设,例如"使用当前的x86架构".

我试图谷歌这个,但我找不到任何东西.

附录:注意到这个问题引起了多大的混淆,我觉得需要一个解释:我想通过这个答案知道,实际上是要知道"3GHz"的含义.我完全清楚每个Herz的吞吐量差别很大,具体取决于架构,硬件,缓存,总线速度和月球位置.

我不是在一个精确而科学的答案之后,而是一个可以用到最终尺度的经验答案.

这不是一个简单的答案(正如我注意到的那样),这是我最大的努力.我知道每行C的ASM行数量取决于你在做什么.i++sqrt(23.1)我不在同一个社区- 我知道这一点.此外,无论我从C中获得什么ASM,ASM都被解释为处理器内的各种微码集,这再次取决于您是运行AMD,英特尔还是其他东西,以及它们各自的代.我也知道这一点.

到目前为止,我所得到的球场答案是我所追求的:一个足够大的项目平均每1行ANSI-C大约2行x86 ASM.今天的处理器可能会在每个时钟周期平均大约一个ASM命令,一旦管道被填满,并给出足够大的样本.

Joh*_*itb 22

没有可能的答案.像这样的语句int a;可能需要零asm行.而语句a = call_is_inlined();可能需要20多个asm行.

您可以通过编译ac程序,然后启动来看到自己objdump -Sd ./a.out.它将显示asm和C代码混合,因此您可以看到为一个C行生成了多少asm行.例:

test.c的

int get_int(int c);
int main(void) {
    int a = 1, b = 2;
    return getCode(a) + b;
}
Run Code Online (Sandbox Code Playgroud)

$ gcc -c -g test.c

$ objdump -Sd ./test.o

00000000 <main>:
int get_int(int c);
int main(void) { /* here, the prologue creates the frame for main */
   0:   8d 4c 24 04             lea    0x4(%esp),%ecx
   4:   83 e4 f0                and    $0xfffffff0,%esp
   7:   ff 71 fc                pushl  -0x4(%ecx)
   a:   55                      push   %ebp
   b:   89 e5                   mov    %esp,%ebp
   d:   51                      push   %ecx
   e:   83 ec 14                sub    $0x14,%esp
    int a = 1, b = 2; /* setting up space for locals */
  11:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%ebp)
  18:   c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%ebp)
    return getCode(a) + b;
  1f:   8b 45 f4                mov    -0xc(%ebp),%eax
  22:   89 04 24                mov    %eax,(%esp)
  25:   e8 fc ff ff ff          call   26 <main+0x26>
  2a:   03 45 f8                add    -0x8(%ebp),%eax
} /* the epilogue runs, returning to the previous frame */
  2d:   83 c4 14                add    $0x14,%esp
  30:   59                      pop    %ecx
  31:   5d                      pop    %ebp
  32:   8d 61 fc                lea    -0x4(%ecx),%esp
  35:   c3                      ret
Run Code Online (Sandbox Code Playgroud)


Rob*_*ble 10

我不确定你的意思是"C指令",也许是陈述或行?当然,由于许多因素,这会有很大差异,但在看了我自己的一些示例程序后,其中很多都接近2-1标记(每个LOC 2个汇编指令),我不知道这是什么意味着什么或它如何有用.

您可以通过要求编译器仅生成程序集(gcc -S例如)或在已编译的可执行文件上使用反汇编程序来自行解决任何特定程序和实现组合(但您需要使用源代码将其与任何方式进行比较) .

编辑

基于您对要完成的内容的澄清(了解现代处理器可以在一秒内执行多少行代码)来扩展这一点:

虽然现代处理器可能以每秒30亿个周期运行,但这并不意味着它每秒可以执行30亿个指令.这里有一些要考虑的事情:

  • 许多指令需要多个周期才能执行(除法或浮点运算可能需要几十个周期才能执行).
  • 大多数程序花费大部分时间等待内存访问,磁盘访问等.
  • 包括OS开销(调度,系统调用等)在内的许多其他因素也是限制因素.

但总的来说,处理器速度非常快,可以在很短的时间内完成令人惊叹的事情.