Performance 代码生成时间

Performance 代码生成时间,performance,algorithm,compiler-construction,Performance,Algorithm,Compiler Construction,对于相对简单(算法上)的语言C,比如C,与解析/词法分析/语义分析相比,代码生成阶段花费了多少时间?我对一个更一般的答案感兴趣,甚至它是非常具体的实现。通过代码生成,我假设您指的是目标代码的生成?如果是这样,这是一个相对快速的过程。大多数编译器使用一个或多个中间表示(IR)来简化分析/优化。当需要将此IR生成目标代码时,它的级别相对较低,因此与目标代码非常相似。这使得输出目标代码非常简单。应该可以在一次过程中生成最终的目标代码。这一问题的答案实际上取决于编译器和为每个阶段选择的算法。一般来说,词

对于相对简单(算法上)的语言C,比如C,与解析/词法分析/语义分析相比,代码生成阶段花费了多少时间?我对一个更一般的答案感兴趣,甚至它是非常具体的实现。

通过代码生成,我假设您指的是目标代码的生成?如果是这样,这是一个相对快速的过程。大多数编译器使用一个或多个中间表示(IR)来简化分析/优化。当需要将此IR生成目标代码时,它的级别相对较低,因此与目标代码非常相似。这使得输出目标代码非常简单。应该可以在一次过程中生成最终的目标代码。

这一问题的答案实际上取决于编译器和为每个阶段选择的算法。一般来说,词法分析/解析将非常便宜,分析和优化将非常昂贵,代码生成将介于两者之间

代码生成通常包括指令选择、调度和寄存器分配。根据编译器的不同,可能还有其他阶段

  • 指令选择是将中间表示转换为特定于体系结构的指令的过程。实现这一点的最简单方法就是为每个IR指令设置一个固定的序列;这会产生糟糕的代码,但速度非常快,因此您可能会在JIT编译器中看到这一点。在像C这样的超前编译语言中,您将有一个“平铺”算法,它用表示机器指令的平铺覆盖IR。存在不同的算法,例如LLVM使用的贪婪算法Maximum much。我知道的所有算法都是O(n),但有些算法需要多次传递。一般来说,瓷砖越优化,所需时间越长
  • 指令调度是安排指令,以便它们在特定CPU上以尽可能少的暂停执行。此阶段高度特定于CPU(而不仅仅是特定于体系结构)。此阶段是可选的
  • 寄存器分配是将变量分配给寄存器或堆栈插槽。同样,有几种算法。图着色是好的,但它必须是近似的,因为真正的图着色是NP完全的。线性扫描(LLVM使用)要快得多,但没有那么好。两种算法都是O(n)

您可以使用GCC使用
-fstats
发出统计信息。以下是gcc4.5生成的示例摘要:

Execution times (seconds)
 callgraph construction:   0.05 ( 1%) usr   0.06 ( 2%) sys   0.14 ( 1%) wall    2885 kB ( 1%) ggc
 callgraph optimization:   0.14 ( 2%) usr   0.05 ( 2%) sys   0.26 ( 2%) wall    4433 kB ( 1%) ggc
 ipa cp                :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall     430 kB ( 0%) ggc
 ipa reference         :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall      11 kB ( 0%) ggc
 ipa pure const        :   0.03 ( 0%) usr   0.01 ( 0%) sys   0.04 ( 0%) wall      31 kB ( 0%) ggc
 ipa SRA               :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.08 ( 1%) wall    5280 kB ( 2%) ggc
 cfg cleanup           :   0.08 ( 1%) usr   0.02 ( 1%) sys   0.12 ( 1%) wall     102 kB ( 0%) ggc
 trivially dead code   :   0.03 ( 0%) usr   0.00 ( 0%) sys   0.05 ( 0%) wall       0 kB ( 0%) ggc
 df multiple defs      :   0.03 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
 df reaching defs      :   0.04 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall       0 kB ( 0%) ggc
 df live regs          :   0.06 ( 1%) usr   0.01 ( 0%) sys   0.17 ( 1%) wall       0 kB ( 0%) ggc
 df live&initialized regs:   0.05 ( 1%) usr   0.00 ( 0%) sys   0.08 ( 1%) wall       0 kB ( 0%) ggc
 df use-def / def-use chains:   0.01 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall       0 kB ( 0%) ggc
 df reg dead/unused notes:   0.08 ( 1%) usr   0.01 ( 0%) sys   0.08 ( 1%) wall    1165 kB ( 0%) ggc
 register information  :   0.02 ( 0%) usr   0.01 ( 0%) sys   0.03 ( 0%) wall       0 kB ( 0%) ggc
 alias analysis        :   0.07 ( 1%) usr   0.01 ( 0%) sys   0.06 ( 0%) wall    2993 kB ( 1%) ggc
 alias stmt walking    :   0.05 ( 1%) usr   0.02 ( 1%) sys   0.10 ( 1%) wall       5 kB ( 0%) ggc
 register scan         :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall      10 kB ( 0%) ggc
 rebuild jump labels   :   0.02 ( 0%) usr   0.01 ( 0%) sys   0.05 ( 0%) wall       0 kB ( 0%) ggc
 preprocessing         :   0.16 ( 2%) usr   0.15 ( 6%) sys   0.34 ( 3%) wall    1508 kB ( 0%) ggc
 parser                :   0.99 (12%) usr   0.36 (14%) sys   1.24 (10%) wall  102915 kB (33%) ggc
 name lookup           :   0.50 ( 6%) usr   0.68 (26%) sys   1.25 (10%) wall   19025 kB ( 6%) ggc
 inline heuristics     :   0.10 ( 1%) usr   0.02 ( 1%) sys   0.13 ( 1%) wall    2310 kB ( 1%) ggc
 integration           :   0.24 ( 3%) usr   0.08 ( 3%) sys   0.29 ( 2%) wall   32982 kB (10%) ggc
 tree gimplify         :   0.12 ( 1%) usr   0.00 ( 0%) sys   0.06 ( 0%) wall   10967 kB ( 3%) ggc
 tree eh               :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall    2932 kB ( 1%) ggc
 tree CFG construction :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.04 ( 0%) wall    6725 kB ( 2%) ggc
 tree CFG cleanup      :   0.15 ( 2%) usr   0.03 ( 1%) sys   0.15 ( 1%) wall     531 kB ( 0%) ggc
 tree VRP              :   0.11 ( 1%) usr   0.00 ( 0%) sys   0.12 ( 1%) wall    9477 kB ( 3%) ggc
 tree copy propagation :   0.09 ( 1%) usr   0.01 ( 0%) sys   0.09 ( 1%) wall    2850 kB ( 1%) ggc
 tree find ref. vars   :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.03 ( 0%) wall     422 kB ( 0%) ggc
 tree PTA              :   0.27 ( 3%) usr   0.00 ( 0%) sys   0.33 ( 3%) wall    2279 kB ( 1%) ggc
 tree PHI insertion    :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall     325 kB ( 0%) ggc
 tree SSA rewrite      :   0.04 ( 0%) usr   0.00 ( 0%) sys   0.06 ( 0%) wall    5069 kB ( 2%) ggc
 tree SSA other        :   0.02 ( 0%) usr   0.03 ( 1%) sys   0.06 ( 0%) wall     547 kB ( 0%) ggc
 tree SSA incremental  :   0.15 ( 2%) usr   0.03 ( 1%) sys   0.17 ( 1%) wall     819 kB ( 0%) ggc
 tree operand scan     :   0.12 ( 1%) usr   0.08 ( 3%) sys   0.25 ( 2%) wall   16876 kB ( 5%) ggc
 dominator optimization:   0.07 ( 1%) usr   0.02 ( 1%) sys   0.04 ( 0%) wall    2663 kB ( 1%) ggc
 tree SRA              :   0.04 ( 0%) usr   0.01 ( 0%) sys   0.02 ( 0%) wall      94 kB ( 0%) ggc
 tree CCP              :   0.07 ( 1%) usr   0.00 ( 0%) sys   0.06 ( 0%) wall    2507 kB ( 1%) ggc
 tree PHI const/copy prop:   0.01 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall       7 kB ( 0%) ggc
 tree split crit edges :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall     991 kB ( 0%) ggc
 tree reassociation    :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall     888 kB ( 0%) ggc
 tree PRE              :   0.15 ( 2%) usr   0.02 ( 1%) sys   0.15 ( 1%) wall    3586 kB ( 1%) ggc
 tree FRE              :   0.07 ( 1%) usr   0.01 ( 0%) sys   0.14 ( 1%) wall    2627 kB ( 1%) ggc
 tree code sinking     :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.03 ( 0%) wall     470 kB ( 0%) ggc
 tree linearize phis   :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall      17 kB ( 0%) ggc
 tree forward propagate:   0.02 ( 0%) usr   0.00 ( 0%) sys   0.03 ( 0%) wall     878 kB ( 0%) ggc
 tree phiprop          :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall      24 kB ( 0%) ggc
 tree conservative DCE :   0.03 ( 0%) usr   0.04 ( 2%) sys   0.04 ( 0%) wall      27 kB ( 0%) ggc
 tree aggressive DCE   :   0.12 ( 1%) usr   0.01 ( 0%) sys   0.15 ( 1%) wall    7686 kB ( 2%) ggc
 tree DSE              :   0.08 ( 1%) usr   0.00 ( 0%) sys   0.03 ( 0%) wall     285 kB ( 0%) ggc
 PHI merge             :   0.00 ( 0%) usr   0.01 ( 0%) sys   0.01 ( 0%) wall      44 kB ( 0%) ggc
 tree loop bounds      :   0.00 ( 0%) usr   0.01 ( 0%) sys   0.01 ( 0%) wall      33 kB ( 0%) ggc
 tree loop invariant motion:   0.01 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall       0 kB ( 0%) ggc
 complete unrolling    :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall    1000 kB ( 0%) ggc
 tree vectorization    :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall     686 kB ( 0%) ggc
 tree slp vectorization:   0.06 ( 1%) usr   0.00 ( 0%) sys   0.07 ( 1%) wall    4623 kB ( 1%) ggc
 tree iv optimization  :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall     671 kB ( 0%) ggc
 predictive commoning  :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall      58 kB ( 0%) ggc
 tree loop init        :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall     824 kB ( 0%) ggc
 tree NRV optimization :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall      18 kB ( 0%) ggc
 tree rename SSA copies:   0.03 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall       0 kB ( 0%) ggc
 dominance frontiers   :   0.01 ( 0%) usr   0.01 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
 dominance computation :   0.27 ( 3%) usr   0.04 ( 2%) sys   0.23 ( 2%) wall       0 kB ( 0%) ggc
 control dependences   :   0.00 ( 0%) usr   0.01 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
 expand                :   0.93 (11%) usr   0.34 (13%) sys   1.18 (10%) wall   22542 kB ( 7%) ggc
 varconst              :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.03 ( 0%) wall     456 kB ( 0%) ggc
 jump                  :   0.00 ( 0%) usr   0.01 ( 0%) sys   0.00 ( 0%) wall     351 kB ( 0%) ggc
 forward prop          :   0.08 ( 1%) usr   0.01 ( 0%) sys   0.10 ( 1%) wall    1368 kB ( 0%) ggc
 CSE                   :   0.13 ( 2%) usr   0.00 ( 0%) sys   0.12 ( 1%) wall     162 kB ( 0%) ggc
 dead code elimination :   0.03 ( 0%) usr   0.00 ( 0%) sys   0.05 ( 0%) wall       0 kB ( 0%) ggc
 dead store elim1      :   0.11 ( 1%) usr   0.00 ( 0%) sys   0.05 ( 0%) wall     612 kB ( 0%) ggc
 dead store elim2      :   0.13 ( 2%) usr   0.00 ( 0%) sys   0.09 ( 1%) wall     932 kB ( 0%) ggc
 loop analysis         :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall     503 kB ( 0%) ggc
 loop invariant motion :   0.01 ( 0%) usr   0.01 ( 0%) sys   0.01 ( 0%) wall      67 kB ( 0%) ggc
 CPROP                 :   0.13 ( 2%) usr   0.00 ( 0%) sys   0.10 ( 1%) wall    1024 kB ( 0%) ggc
 PRE                   :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall     118 kB ( 0%) ggc
 CSE 2                 :   0.09 ( 1%) usr   0.02 ( 1%) sys   0.05 ( 0%) wall     221 kB ( 0%) ggc
 branch prediction     :   0.03 ( 0%) usr   0.02 ( 1%) sys   0.06 ( 0%) wall    1578 kB ( 1%) ggc
 combiner              :   0.10 ( 1%) usr   0.00 ( 0%) sys   0.08 ( 1%) wall     679 kB ( 0%) ggc
 if-conversion         :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.06 ( 0%) wall     953 kB ( 0%) ggc
 regmove               :   0.02 ( 0%) usr   0.00 ( 0%) sys   0.02 ( 0%) wall       1 kB ( 0%) ggc
 integrated RA         :   0.35 ( 4%) usr   0.00 ( 0%) sys   0.34 ( 3%) wall    4128 kB ( 1%) ggc
 reload                :   0.20 ( 2%) usr   0.01 ( 0%) sys   0.31 ( 3%) wall    2554 kB ( 1%) ggc
 reload CSE regs       :   0.11 ( 1%) usr   0.00 ( 0%) sys   0.13 ( 1%) wall    1551 kB ( 0%) ggc
 load CSE after reload :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall       1 kB ( 0%) ggc
 thread pro- & epilogue:   0.03 ( 0%) usr   0.00 ( 0%) sys   0.08 ( 1%) wall    3980 kB ( 1%) ggc
 if-conversion 2       :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall     456 kB ( 0%) ggc
 combine stack adjustments:   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall       0 kB ( 0%) ggc
 peephole 2            :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.05 ( 0%) wall     124 kB ( 0%) ggc
 hard reg cprop        :   0.06 ( 1%) usr   0.00 ( 0%) sys   0.05 ( 0%) wall      31 kB ( 0%) ggc
 scheduling 2          :   0.42 ( 5%) usr   0.02 ( 1%) sys   0.36 ( 3%) wall     630 kB ( 0%) ggc
 machine dep reorg     :   0.04 ( 0%) usr   0.00 ( 0%) sys   0.04 ( 0%) wall       6 kB ( 0%) ggc
 reorder blocks        :   0.04 ( 0%) usr   0.00 ( 0%) sys   0.06 ( 0%) wall     919 kB ( 0%) ggc
 final                 :   0.05 ( 1%) usr   0.00 ( 0%) sys   0.10 ( 1%) wall    1187 kB ( 0%) ggc
 symout                :   0.02 ( 0%) usr   0.01 ( 0%) sys   0.04 ( 0%) wall     148 kB ( 0%) ggc
 plugin execution      :   0.18 ( 2%) usr   0.32 (12%) sys   0.43 ( 4%) wall       0 kB ( 0%) ggc
 TOTAL                 :   8.48             2.64            12.15             315665 kB

根据我的经验,C编译器大部分时间都花在读取头文件上。我曾经使用一个C编译器来打印统计数据,即使是非常简单的100行文件,如果它们进行足够多的系统调用,也会包含10000行标题。

代码优化本身可能需要相当长的时间,在许多情况下,程序员可以控制,因为可以使用特殊的编译器/链接器优化选项指定(例如gcc中的-O2)。
cc1:警告:命令行选项“-fstats”对C++/ObjC++有效,但对C
Oops无效!幸运的是,我正在尝试的程序可以编译为C或C++。我怀疑上面的结果可能是由一个翻译单元产生的,这个翻译单元对头文件材料的要求很低。这是一年半以前的事了。IIRC,它是我的基本库——或者说是依赖链的底部。好的假设=)Objc++是支持同一个TUBO和C++的方言。有限制,例如对象不应该从另一个Lange派生,并且不能在命名空间中声明Objc符号。编译也需要相当多的时间。