Jak skonfigurować pamięć podręczną?

36

Chcę użyć pamięci podręcznej, aby przyspieszyć kompilację.

Natknąłem się Jak włączyć pamięć podręczną? .

Oto co dotychczas zrobiłem:

$ sudo apt-get install -y ccache
$ dpkg -l ccache
ii  ccache  3.1.6-1   Compiler cache for fast recompilation of C/C++ code
$ whereis ccache
ccache: /usr/bin/ccache /usr/lib/ccache /usr/bin/X11/ccache /usr/share/man/man1/ccache.1.gz

Dołączyłem ccachedo ścieżki, dodając ją do mojego ~/.bashrcpliku:

$ export PATH="/usr/lib/ccache:$PATH"
$ source ~/.bashrc
$ echo $PATH
/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Linki symboliczne wyglądają dobrze:

$ ll /usr/lib/ccache/
total 76
drwxr-xr-x   2 root root  4096 mai   22 10:48 ./
drwxr-xr-x 253 root root 69632 mai   22 10:48 ../
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 avr-gcc-4.5.3 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c89-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 c99-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 cc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 gcc-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-g++ -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-g++-4.6 -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-gcc -> ../../bin/ccache*
lrwxrwxrwx   1 root root    16 mai   22 10:48 x86_64-linux-gnu-gcc-4.6 -> ../../bin/ccache*

Link wygląda dobrze:

$ which g++
/usr/lib/ccache/g++

$ make
g++ -o affine_euler affine_euler.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3
g++ -o test_eigen test_eigen.cpp -O3 -DEIGEN_NO_DEBUG -I/usr/include/eigen3

Ale pamięć podręczna jest pusta:

$ ccache -s
cache directory                     /home/dell/.ccache
cache hit (direct)                     0
cache hit (preprocessed)               0
cache miss                             0
files in cache                         0
cache size                             0 Kbytes
max cache size                       1.0 Gbytes

Gdzie się mylę?

Victor Lamoine
źródło
Uświadomiłem sobie, że działa w ogólnym przypadku, ale nie z moim plikiem makefile (na przykład działa z cmake). Myślę, że problem dotyczy mojego pliku makefile, a nie konfiguracji ccache.
Victor Lamoine

Odpowiedzi:

45

Instalacja:

# Install package
sudo apt install -y ccache

# Update symlinks
sudo /usr/sbin/update-ccache-symlinks

# Prepend ccache into the PATH
echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc

# Source bashrc to test the new PATH
source ~/.bashrc && echo $PATH

Twoja ścieżka (przynajmniej początek) powinna wyglądać następująco:

/usr/lib/ccache:/usr/local/cuda-5.5/bin/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

I g++/ gccpowinien teraz wskazywać na:

which g++ gcc
/usr/lib/ccache/g++
/usr/lib/ccache/gcc

Konfiguracja:

Jeśli nie chcesz mieć ograniczenia liczby plików i rozmiaru pamięci podręcznej:

ccache -F 0
ccache -M 0

Pokaż statystyki pamięci podręcznej:

ccache -s

Opróżnij pamięć podręczną i zresetuj statystyki:

ccache -C -z

Stosowanie:

Za każdym razem, gdy dzwonisz gcclub g++; ccachenazywa się. Mój błąd polegał na tym, że nie usunąłem już skompilowanych plików. Po prostu usuń wszystkie CMakepliki / wyjściowe i ponownie skonfiguruj / skompiluj.

Twój ccachenie powinien być pusty. Teraz spróbuj make cleana, makea zobaczysz, że jest to znacznie szybsze niż ponowna kompilacja wszystkiego dzięki pamięci podręcznej.

Victor Lamoine
źródło
trochę jak po wykonaniu tej instrukcji ccache nie buforuje clang i clang ++ ...
Wang
4

Twój $PATHnie wygląda poprawnie; ccachepowinien tam być katalog. Po prostu biegnij:

export PATH="/usr/lib/ccache/:$PATH"

... i spróbuj g++ponownie wykonać polecenia. Ten katalog jest pełen wywoływanych poleceń proxy ccache. To powinno działać z większością skryptów.


Jeśli po prostu dzwonisz g++ręcznie (inaczej niż wyżej, gdzie używasz make), możesz po prostu wstawić polecenie:

ccache g++ ...
Oli
źródło
Ten katalog nie istnieje: $ ls -1 /usr/lib/ccache/ avr-g++ avr-gcc avr-gcc-4.5.3 c++ c89-gcc c99-gcc cc g++ g++-4.6 gcc gcc-4.6 x86_64-linux-gnu-g++ x86_64-linux-gnu-g++-4.6 x86_64-linux-gnu-gcc x86_64-linux-gnu-gcc-4.6
Victor Lamoine
Czytałem samouczek Arch. Jeśli wszystko jest po prostu po /usr/lib/ccache/prostu tego użyj.
Oli
Nie działa z export PATH="/usr/lib/ccache/:$PATH" binarnym ccache w /usr/bini /usr/bin/X11. Próbowałem obu tych ścieżek bez powodzenia
Victor Lamoine
Ale wszystkie polecenia proxy (jak wymieniono powyżej) są dostępne /usr/lib/ccache/. Dodać je do swojej drodze tak, że podczas makerozmowy g++lub ccczy cokolwiek innego, to faktycznie wywołanie ccachewersji wyposażonym w technologię.
Oli
Jestem blisko, ponieważ link wskazuje teraz na pamięć podręczną (edytowałem pierwszy post), ale pamięć podręczna jest zawsze pusta.
Victor Lamoine
1

W odniesieniu do instalacji:

Przekonałem się, że w Ubuntu 18.04 (Bionic Beaver) domyślna wersja nie przechwytuje wywołań cci c++. Aby w pełni zainstalować tam pamięć podręczną, potrzebujesz:

sudo apt install ccache
sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"

A następnie (ze względu na zaktualizowane dowiązania symboliczne) również połączenia cci c++daj się złapać!

Jürgen Weigert
źródło