Sử dụng bộ đệm biên dịch (compiler cache) để tăng tốc độ build C/C++
Trong các dự án C/C++ lớn, thời gian build có thể kéo dài do phải biên dịch lại nhiều tệp giống nhau sau mỗi lần sửa đổi. Việc sử dụng compiler cache sẽ giúp giảm thiểu việc biên dịch dư thừa bằng cách lưu trữ kết quả các bản build trước đó và tái sử dụng nếu không có thay đổi.
Compiler cache là gì?
Compiler cache là hệ thống trung gian nằm giữa trình biên dịch và người dùng. Khi bạn yêu cầu biên dịch một file:
- Nếu file đó và các tham số biên dịch giống hệt lần trước, cache sẽ trả về file
.o
hoặc.obj
đã lưu. - Nếu có thay đổi, cache sẽ gọi trình biên dịch thực sự để tạo lại file mới.
Kết quả: giảm đáng kể thời gian build khi không có thay đổi đáng kể trong source.
Các công cụ phổ biến
Tên công cụ | Hệ điều hành hỗ trợ | Compiler hỗ trợ | Ghi chú |
---|---|---|---|
ccache | Linux, macOS, Windows (WSL, MSYS2) | gcc, clang | Rất phổ biến trong môi trường Unix |
sccache | Linux, macOS, Windows (native) | gcc, clang, MSVC | Hỗ trợ build song song và cloud cache |
clcache | Windows | MSVC (cl.exe) | Python script, dễ tích hợp vào VSCode |
Dùng ccache với gcc/clang
- Cài đặt:
# Trên Ubuntu/Debian
sudo apt install ccache
# Trên Arch
sudo pacman -S ccache
# Trên MSYS2
pacman -S ccache - Cấu hình sử dụng:
- Cách 1: Thay thế compiler bằng ccache wrapper
export CC="ccache gcc"
export CXX="ccache g++" - Cách 2: Dùng symbolic link
ln -s /usr/bin/ccache /usr/local/bin/g++
ln -s /usr/bin/ccache /usr/local/bin/gcc - Cách 3: Dùng với
tasks.json
(VSCode){
"version": "2.0.0",
"tasks": [
{
"label": "Build with ccache (g++)",
"type": "shell",
"command": "ccache",
"args": ["g++", "-c", "${file}"],
"group": "build"
}
]
} - Ghi chú: Kiểm tra bằng
ccache -s
để xem thống kê cache.
- Cách 1: Thay thế compiler bằng ccache wrapper
Dùng sccache với clang/gcc/cl
- Cài đặt:
# Build qua cargo (yêu cầu Rust)
cargo install sccache --locked- Hoặc tải binary từ GitHub: https://github.com/mozilla/sccache/releases
- Sử dụng:
Giốngccache
, bạn có thể thay compiler bằng wrapper:Hoặc dùng với MSVC trong VSCode hoặc CMake:export CC="sccache clang"
export CXX="sccache clang++"Dùng vớiset(CMAKE_C_COMPILER_LAUNCHER sccache)
set(CMAKE_CXX_COMPILER_LAUNCHER sccache)
# Tùy chọn: Tăng kích thước cache tối đa
set(ENV{SCCACHE_CACHE_SIZE} "10G")tasks.json
(VSCode){
"version": "2.0.0",
"tasks": [
{
"label": "Build with sccache (clang-cl)",
"type": "shell",
"command": "sccache",
"args": ["clang-cl", "/nologo", "/c", "${file}"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}sccache
hỗ trợ lưu cache trên cloud (S3, GCS...) nên phù hợp CI/CD hoặc team đông người.
Dùng clcache với MSVC
- Cài đặt:
pip install clcache
- Sử dụng:
Thay thếcl.exe
bằngclcache.exe
trong VSCode hoặc thiết lập biến môi trường:Hoặc dùng trongset CC=clcache
tasks.json
:"command": "clcache",
"args": ["/nologo", "/c", "main.cpp"]clcache
hoạt động tốt cho dự án nhỏ và đơn máy.
Lưu ý khi dùng compiler cache
- Cache chỉ có hiệu quả khi source file và cờ biên dịch không thay đổi.
- Thay đổi version compiler có thể làm cache không dùng được.
- Một số cờ như
-g
,-MMD
,-fprofile-*
có thể ảnh hưởng đến cache. - Nên kiểm tra thống kê cache thường xuyên (
ccache -s
,sccache --show-stats
).