代码之家  ›  专栏  ›  技术社区  ›  Henrik Paul

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

  •  11
  • Henrik Paul  · 技术社区  · 17 年前

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

    我试着用谷歌搜索一下,但什么也找不到。

    当前位置注意到这个问题带来了多大的困惑,我觉得需要一个解释:我想从这个答案中知道的是,实际上,“3GHz”是什么意思。我完全知道,每赫兹的吞吐量因架构、硬件、缓存、总线速度和月球位置的不同而有很大差异。

    我追求的不是一个精确和科学的答案,而是一个可以被放在可预测范围内的经验答案。

    这不是对place的一个微不足道的回答(正如我开始注意到的),这是我在这方面的最大努力。我知道,每行C中生成的ASM行数根据您所做的操作而有所不同。 i++ 和你的邻居不在一起 sqrt(23.1) -我知道这一点。此外,无论我从C中得到什么ASM,ASM都会被解释为处理器中的各种微码集,这同样取决于您是运行AMD、Intel还是其他产品,以及它们各自的代。我也知道这一点。

    8 回复  |  直到 17 年前
        1
  •  22
  •   Johannes Schaub - litb    17 年前

    没有可能的答案。声明如 int a; a = call_is_inlined();

    objdump -Sd ./a.out . 它将混合显示asm和C代码,因此您可以看到一个C代码行生成了多少asm代码行。例子:

    int get_int(int c);
    int main(void) {
        int a = 1, b = 2;
        return getCode(a) + b;
    }
    

    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
    
        2
  •  12
  •   Robert Gamble    17 年前

    我不知道你说的“C指令”是什么意思,可能是语句还是行?当然,由于许多因素,这会有很大的不同,但在查看了我自己的一些示例程序后,其中许多程序接近2-1标记(每个LOC 2个装配说明),我不知道这意味着什么,也不知道它如何有用。

    gcc -S 例如)或在已编译的可执行文件上使用反汇编程序(但无论如何都需要源代码将其与之进行比较)。

    编辑

    根据您对所要完成任务的说明(了解一个现代处理器一秒钟可以执行多少行代码),在此基础上进行扩展:

    • 许多指令需要多个周期才能执行(除法或浮点运算可能需要几十个周期才能执行)。
    • 包括操作系统开销(调度、系统调用等)在内的许多其他因素也是限制因素。

    但总的来说,是的,处理器速度惊人,可以在短时间内完成惊人的事情。

        3
  •  4
  •   Bill    17 年前

    这差别很大!我不相信任何人,如果他们试图提供一个粗略的转换。

    声明如 i++; 可以翻译成单个 INC AX

    然后在那里添加编译器优化,它将以不同于您编写代码的方式组装代码,从而消除指令。

    还有一些指令在机器字边界上运行得更好,因此 NOP

        4
  •  3
  •   Will Dean    17 年前

    我认为你不能下结论 任何东西 有用的 关于实际应用程序的性能,请参考此处的内容。除非“不精确”是指“在几个数量级内”。

    你只是过于笼统,你忽略了缓存等,就好像它是次要的,而它很可能是完全主导的。

    如果您的应用程序足够大,每个loc都有一些平均指令,那么它也足够大,可以考虑I/O或最不重要的RAM访问问题。

        5
  •  2
  •   call me Steve    17 年前

    根据您的环境,您可以使用visual studio选项:/FAs

    更多 here

        6
  •  1
  •   tcurdt    17 年前

    我不确定是否真的有一个有用的答案。当然,您必须选择架构(如您所建议的)。

    我要做的是:使用一个大小合理的C程序。给gcc一个“-S”选项,然后自己检查。它将生成汇编程序源代码,您可以自己计算该程序的比率。

        7
  •  1
  •   Paul Nathan    17 年前

    这就是重复上面的几点,直到你对你正在使用的代码类型有了非常具体的了解,你才知道这些。

    您可以尝试回顾有关装配优化和过去30-40年中发生的硬件/软件干扰串扰的学术文献。在那里你可以找到一些你感兴趣的真实数据。(尽管我警告您,您可能最终看到的是C->PDP数据,而不是C->IA-32数据)。

        8
  •  1
  •   Sebastian Mach    15 年前

    您在其中一条评论中写道,您想知道3GHz的含义。