前言
笔者最近加入了新的团队,开始负责编译打包相关工作,因而开始学习优化编译时间相关技术。讲真,蛮开心的,每天都有挑战,同时每天都有收获,天天都在涨姿势,所以想记录下来并分享出来,也方便以后自己需要时回顾。
本文主要介绍如何利用 clang 的 -ftime-trace 导出编译期间耗时 profile,是一篇基础的 step by step 文章。本文大致会介绍以下内容:
简介 LLVM & Clang 和编译原理
-ftime-trace 介绍与使用
CLANG_ENABLE_MODULES 配置项引起的困惑
LLVM & Clang
Clang(发音为/ˈklæŋ/类似英文单字clang) 是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。它采用了LLVM作为其后端,而且由LLVM2.6开始,一起发布新版本。—— wikipedia
通过 Wikipedia 的介绍,可以对 LLVM 和 Clang 有一个大概了解,那么接下来就再了解编译器的设计架构模型。
传统静态编译器(如大多数C编译器)最受欢迎的设计是三阶段设计,其主要组件是前端,优化器和后端。前端解析源代码,检查源代码是否存在错误,并构建特定于语言的抽象语法树(AST)来表示输入代码。可以选择将 AST 转换为新的表示形式以进行优化,并且优化程序和后端在代码上运行。
而编译的过程可以分解为以下几个阶段:
预处理(Preprocessing)
符号化(Tokenization)
语法分析(Syntactic analysis,也叫 Parsing)语义分析(Semantic analysis)
中间代码(LLVM IR, Intermidiate Code)
汇编器(Assembler)
链接器(Linker)
基本回顾完编译过程之后,下面就介绍如何做编译耗时分析。
Clang -ftime-trace 简介及使用
-ftime-t