博客 / 詳情

返回

cache使用簡介

ccache是什麼

ccache -- “compiler cache”的縮寫,是一個gcc/g++的c語言編譯器緩存。

ccache能做什麼

簡單來説,ccache將基於單條gcc編譯命令級別顆粒,將本次編譯命令的產物,複製進行壓縮一份到緩存目錄中,下次編譯的時候, <font color='red'>如果檢測到相同編譯命令,並且沒有修改輸入的源文件(當前c/cpp或依賴的頭文件) </font>,則直接讀取緩存目錄中上次編譯流程,省去編譯時間,從而優化編譯時長。

對項目工程而言,一次代碼修改僅會改變極少量的源文件,使用ccache只會重新編譯修改部分的代碼相關的源文件,而未進行修改的源文件則可以直接使用緩存優化了編譯時長。

ccache的效率如何

  • 小試牛刀
    使用ccache編譯一個簡單的cpp

    • 原始編譯
      time g++ hello.cpp -o hello.o

    原始編譯

    • 首次通過ccache 進行編譯
      time ccache g++ hello.cpp -o hello.o

    在這裏插入圖片描述

- 二次通過ccache 進行編譯
`time ccache g++ hello.cpp -o hello.o`
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/23e8fb82944d48c0a400b0d2db1478d6.png)
編譯方式 編譯時長
原始構建 0.24s
使用ccache首次構建 0.30s
使用ccache二次構建 0.02s

使用ccache首次編譯時長 > 原始編譯時長 >> 使用ccache二次編譯時長

原因是使用ccache會對編譯命令做緩存處理需要花費一些耗時。
(具體原因放在之後再更新)

  • 實際工程表現
    以使用虛擬機1U2G規格編譯redis-6.0.16:
    原始直接make:
    在這裏插入圖片描述

    make clean後使用ccache首次編譯:
    在這裏插入圖片描述

    make clean後使用ccache二次編譯:
    在這裏插入圖片描述

編譯方式 編譯時長
原始構建 35s
使用ccache首次構建 43s
使用ccache二次構建 2.8s

可以看到,對於重複編譯,無論是單命令編譯,還是實際工程編譯,使用ccache構建速度都壓縮了十倍,極大的提升了編譯效率!

ccache 如何使用

## 安裝ccche

  • apt直接安裝

    # 安裝ccache
    apt install ccache
    # 查看ccache版本
    ccache -V 
  • 源碼安裝
    目前ccache遵循GPL-3.0在github上開源,並且處於開源軟件的成長期,迭代較快,apt源並不能實時同步最新版本,可通過源碼編譯安裝的方式,獲取最新版本。
    github: https://github.com/ccache/ccache

ccache的使用方式

  • ccache 拉起編譯命令

      ccache g++ -c hello.cpp -o hello.o
  • ccache偽裝成編譯器

      # 找到ccache的安裝路徑
      which ccache 
      # 安裝實際路徑為: /usr/bin/ccache 
      # 創建軟連接,將ccache偽裝成g++編譯器
      ln -s /usr/bin/ccache g++
      # 使用偽裝後的g++ 進行編譯
      ./g++ -c hello.cpp -o hello.o

    可是問題來了

    在實際工程當中,可能是由Makefile或者CMake進行管理編譯,不可能手動修改所有的編譯命令,我們應該將ccache使用上呢?

最為常用的方式是:
無論是在Makefile還是Cmake都可以通過聲明環境變量的方式來使用ccache

# 在構建腳本中增加
export CC="ccache gcc"
export CXX="ccache g++"
# 再進行編譯make/cmake 
make 
# cmake: 
cmake -B output && cmake --build output
  • make

對於Makefile工程,我們常會通過會在Makefile中,通過CC/CXX指定編譯器,因此在編譯前通過配置緩存變量CC/CXX來指定要是用編譯器即可。
在這裏插入圖片描述

  • cmake
    Cmake隱式使用CC和CXX兩個緩存變量,通過export 配置CC/CXX一樣能使ccache生效。
    在這裏插入圖片描述

    ccache使用情況

    如上在使用ccache跑一個CMake工程的時候,我們如果不注意標準輸出內容,就比較難判斷本次編譯是否使用了ccache。

有沒有一種更好的方式來幫助我們判斷當前工程有沒有使用ccache呢?

ccache提供了查詢緩存命中能力
執行 ccache -s -v
在這裏插入圖片描述

可以詳細的看到

  • 緩存存放目錄
    Cache directory
  • 緩存配置文件路徑
    Primary config
  • 最近一次使用緩存的時間
    Status updated
  • 緩存總體命中的情況

    • Hits表示命中緩存
    • Misses表示未命中緩存,但是生成了緩存,下次可以命中
  • 緩存目錄使用大小
    Cache size

注意:

ccache 會通過LRU自動清理較長未訪問的緩存文件,使得緩存總大小小於Cache size。不要手動清理Cache directory目錄,造成緩存丟失。

如果默認緩存目錄會影響到你的正常使用磁盤,可通過 在/etc/profile 增加ccache配置緩存目錄的環境變量,改變緩存目錄並使其一直生效。

# 將ccache的緩存目錄設置為了/usr1/zhou/ccache
vim /etc/profile
# 追加環境變量
export CCACHE_DIR=/usr1/zhou/ccache 
# 讓環境變量生效
source /etc/profile

小結

如果你只是想簡單瞭解並使用ccache, 通過上述的介紹,已經可以滿足日常使用ccache幫助自己的工程更快的進行編譯。

如果還想對ccache有更深的瞭解,在後續內容中會介紹ccache 其他好用的配置項功能以及ccache的源碼實現。
歡迎大家一起交流呀
qq羣:3638803451
vx:wxid_sgdelhiwombj12

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.