Chuyển tới nội dung chính

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ú
ccacheLinux, macOS, Windows (WSL, MSYS2)gcc, clangRất phổ biến trong môi trường Unix
sccacheLinux, macOS, Windows (native)gcc, clang, MSVCHỗ trợ build song song và cloud cache
clcacheWindowsMSVC (cl.exe)Python script, dễ tích hợp vào VSCode

Dùng ccache với gcc/clang

  1. Cài đặt:
    # Trên Ubuntu/Debian
    sudo apt install ccache

    # Trên Arch
    sudo pacman -S ccache

    # Trên MSYS2
    pacman -S ccache
  2. 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.

Dùng sccache với clang/gcc/cl

  1. Cài đặt:
    # Build qua cargo (yêu cầu Rust)
    cargo install sccache --locked
  2. Sử dụng:
    Giống ccache, bạn có thể thay compiler bằng wrapper:
    export CC="sccache clang"
    export CXX="sccache clang++"
    Hoặc dùng với MSVC trong VSCode hoặc CMake:
    set(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")
    Dùng với 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

  1. Cài đặt:
    pip install clcache
  2. Sử dụng:
    Thay thế cl.exe bằng clcache.exe trong VSCode hoặc thiết lập biến môi trường:
    set CC=clcache
    Hoặc dùng trong 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).