Performance 代码生成时间
对于相对简单(算法上)的语言C,比如C,与解析/词法分析/语义分析相比,代码生成阶段花费了多少时间?我对一个更一般的答案感兴趣,甚至它是非常具体的实现。通过代码生成,我假设您指的是目标代码的生成?如果是这样,这是一个相对快速的过程。大多数编译器使用一个或多个中间表示(IR)来简化分析/优化。当需要将此IR生成目标代码时,它的级别相对较低,因此与目标代码非常相似。这使得输出目标代码非常简单。应该可以在一次过程中生成最终的目标代码。这一问题的答案实际上取决于编译器和为每个阶段选择的算法。一般来说,词法分析/解析将非常便宜,分析和优化将非常昂贵,代码生成将介于两者之间 代码生成通常包括指令选择、调度和寄存器分配。根据编译器的不同,可能还有其他阶段Performance 代码生成时间,performance,algorithm,compiler-construction,Performance,Algorithm,Compiler Construction,对于相对简单(算法上)的语言C,比如C,与解析/词法分析/语义分析相比,代码生成阶段花费了多少时间?我对一个更一般的答案感兴趣,甚至它是非常具体的实现。通过代码生成,我假设您指的是目标代码的生成?如果是这样,这是一个相对快速的过程。大多数编译器使用一个或多个中间表示(IR)来简化分析/优化。当需要将此IR生成目标代码时,它的级别相对较低,因此与目标代码非常相似。这使得输出目标代码非常简单。应该可以在一次过程中生成最终的目标代码。这一问题的答案实际上取决于编译器和为每个阶段选择的算法。一般来说,词
- 指令选择是将中间表示转换为特定于体系结构的指令的过程。实现这一点的最简单方法就是为每个IR指令设置一个固定的序列;这会产生糟糕的代码,但速度非常快,因此您可能会在JIT编译器中看到这一点。在像C这样的超前编译语言中,您将有一个“平铺”算法,它用表示机器指令的平铺覆盖IR。存在不同的算法,例如LLVM使用的贪婪算法Maximum much。我知道的所有算法都是O(n),但有些算法需要多次传递。一般来说,瓷砖越优化,所需时间越长
- 指令调度是安排指令,以便它们在特定CPU上以尽可能少的暂停执行。此阶段高度特定于CPU(而不仅仅是特定于体系结构)。此阶段是可选的
- 寄存器分配是将变量分配给寄存器或堆栈插槽。同样,有几种算法。图着色是好的,但它必须是近似的,因为真正的图着色是NP完全的。线性扫描(LLVM使用)要快得多,但没有那么好。两种算法都是O(n)
-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符号。编译也需要相当多的时间。