检查ccache调用是否是缓存命中

时间:2019-04-28 13:22:45

标签: ccache

作为构建过程的一部分,我想获取有关构建时间以及ccache是​​否在缓存中找到该项目的统计信息。我知道ccache -s,在这里我可以比较先前和当前的缓存命中计数。

但是,如果我有数百个并行运行的编译线程,则统计信息不会告诉我是哪个文件引起了点击。

ccache的返回码是编译器的返回码。有什么办法可以让ccache告诉我它是否成功?

2 个答案:

答案 0 :(得分:1)

有两种选择:

  1. 启用ccache日志文件:将配置(或环境变量log_file)中的CCACHE_LOGFILE设置为文件路径。然后,您可以从日志数据中找出每次编译的结果。如果有很多并行ccache调用(它们之间共享日志文件,因此来自不同进程的日志记录将被交错),可能会有些乏味,但是可以通过考虑每条日志行的PID部分来实现。 / li>
  2. 在ccache 3.5及更高版本中,最好启用调试模式:在配置中设置debug = true(或环境变量CCACHE_DEBUG=1)。然后ccache将每个产生的目标文件的日志存储在<objectfile>.ccache-log中。在ccache手册的Cache debugging中了解更多信息。

答案 1 :(得分:0)

我写了一个快速n脏脚本,告诉我必须重建哪些文件以及什么是缓存未命中率:

样本输出(被截断)

ccache hit: lib/expression/unary_minus_expression.cpp
ccache miss: lib/expression/in_expression.cpp
ccache miss: lib/expression/arithmetic_expression.cpp

=== 249 files, 248 cache misses (0.995984 %)===

脚本:

#!/usr/bin/env python3

from pathlib import Path
import re
import os

files = {}
for filename in Path('src').rglob('*.ccache-log'):
  with open(filename, 'r') as file:
    for line in file:
      source_file_match = re.findall(r'Source file: (.*)', line)
      if source_file_match:
        source_file = source_file_match[0]
      result_match = re.findall(r'Result: cache (.*)', line)
      if result_match:
        result = result_match[0]
        files[source_file] = result
        break

if len(files) == 0:
  print("No *.ccache-log files found. Did you compile with ccache and the environment variable CCACHE_DEBUG=1?")
  sys.exit(1)

common_path_prefix = os.path.commonprefix(list(files.keys()))
files_shortened = {}

misses = 0
for file in files:
  shortened = file.replace(common_path_prefix, '')
  if files[file] == 'miss':
    misses += 1
    print("ccache miss: %s" % (shortened))

print("\n=== %i files, %i cache misses (%f %%)===\n" % (len(files), misses, float(misses) / len(files) * 100))

请注意,这会将所有ccache-log文件考虑在内,而不仅仅是最后一次构建的文件。如果需要后者,只需先删除日志文件即可。