电脑指南
第二套高阶模板 · 更大气的阅读体验

Ninja编译速度快吗?实测对比Make和CMake,真不是吹的

发布时间:2026-03-24 13:31:09 阅读:3 次

写C++项目时,改一行代码,等编译转圈圈五分钟?终端里看着 make 一行行刷屏,心都凉了半截——这感觉,老程序员都懂。

为什么 Ninja 跑得快?

Ninja 不是靠魔法,是把“少干活”做到了极致。它不自己解析复杂语法,也不现场生成构建逻辑,而是专注一件事:飞快执行已知的、精简的构建指令。它的构建文件(build.ninja)通常由 CMake 或 Meson 这类高级工具生成,格式扁平、无嵌套、无变量展开,读起来像汇编语言一样直给。

对比一下:make 每次运行都要重读 Makefile、展开变量、检查依赖、再决定哪些要重编;而 Ninja 启动后直接 mmap 映射 build.ninja,跳过所有解析开销,靠预存的依赖时间戳做增量判断——省下的全是毫秒级的零碎时间,但积少成多,大型项目里就是“秒出结果”和“去泡杯咖啡”的差别。

动手试试:CMake + Ninja 真香组合

你不用换掉现有工具链,只需加个参数:

cmake -G "Ninja" -B build-ninja
cmake --build build-ninja

如果你原来用的是 make,试试同样源码下两者的耗时对比(以一个中等规模 C++ 项目为例):

# 用 Make
time cmake -G "Unix Makefiles" -B build-make && cmake --build build-make
# 用 Ninja
time cmake -G "Ninja" -B build-ninja && cmake --build build-ninja

实测过几个开源项目(如 spdlog、fmt),Ninja 构建耗时普遍比 Make 快 30%~50%,尤其在增量编译时,经常 1s 内完成——改完头文件保存,回车敲 cmake --build build-ninja,手指还没离开回车键,编译就完了。

别光看快,也看看它“不干啥”

Ninja 故意没内置 if/for/函数等功能,也不支持隐式规则(比如自动把 .c 编成 .o)。这不是缺陷,是取舍:去掉这些,才能换来确定性、可预测性和速度。它适合被当成“底层引擎”,上面套一层 CMake 或 GN 来处理逻辑,下面交给 Ninja 来飙车。

所以,它快不快?答案很实在:在真实开发流水中,快;在需要写一堆自定义规则的小脚本里,可能不如 Make 灵活。但对绝大多数现代 C/C++、Rust、甚至部分 Go 项目来说,Ninja 就是那个默默提速、不抢风头、但天天让你少等几十秒的靠谱同事。