Сабж — вполне себе работает и даже шустро. Вот тут захотелось мне на генте увеличить размер кеша ccache гиг эдак до 16-ти и заодно выставить CCACHE_NLEVELS=4 (глубина вложенности папок /var/tmp/ccache/a/b/c/d/abcd0123abcd0123abcd0123abcd0123*). Поначалу это даёт существенный оверхед на создание всех этих каталогов (на нижнем уровне 16*16*16*16=65 тыс). И захотелось мне посмотреть, сколько файлов в среднем в каждый каталог нижнего уровня ложится, да и сколько всего этих каталогов уже создано. Вот так:
$ cat ccache-stats.scala
import java.io._
import collection.mutable.HashMap
// Result buffers:
var numDirs = 0
var numDirsByNumFiles = new HashMap[Int, Int]
val root = new File("/var/tmp/ccache")
val dirFilter = new FileFilter {
def accept(f: File) = f.isDirectory && f.getName.length == 1
}
val oFilter = new FileFilter {
def accept(f: File) = f.isFile // && f.getName.endsWith(".o")
}
for {
d1 <- root.listFiles(dirFilter)
d2 <- d1.listFiles(dirFilter)
d3 <- d2.listFiles(dirFilter)
d4 <- d3.listFiles(dirFilter)
numFiles = d4.listFiles(oFilter).length
} {
// println(d4 + ": " + numFiles)
numDirs += 1
numDirsByNumFiles(numFiles) = numDirsByNumFiles.getOrElse(numFiles, 0) + 1
}
println("numDirs = " + numDirs)
println("numDirsByNumFiles = " + numDirsByNumFiles.toList.sortBy(_._1).map(t2 => t2._1 + " -> " + t2._2).mkString(", "))
println("totalFiles = " + numDirsByNumFiles.map { case(k,v) => k * v }.sum)
$ scala ccache-stats.scala
numDirs = 56296
numDirsByNumFiles = 0 -> 1218, 1 -> 17464, 2 -> 16342, 3 -> 11052, 4 -> 5824, 5 -> 2759, 6 -> 1048, 7 -> 382, 8 -> 141, 9 -> 45, 10 -> 15, 11 -> 5, 12 -> 1
totalFiles = 131107
$ ccache -s
cache directory /var/tmp/ccache
cache hit (direct) 93402
cache hit (preprocessed) 14096
cache miss 58621
called for link 15432
called for preprocessing 18627
multiple source files 26
compiler produced stdout 3
compile failed 5975
ccache internal error 3
preprocessor error 2575
cache file missing 13
bad compiler arguments 2746
unsupported source language 998
autoconf compile/link 43467
unsupported compiler option 2888
no input file 13508
files in cache 135019
cache size 2.2 Gbytes
max cache size 16.0 Gbytes
Скрипт отрабатывает за 4 секунды. Когда каталогов было меньше раза в полтора, отрабатывал за две. Причём попытка отдельно компилять, потом отдельно выполнять ничего не изменила — отрабатывало также за 2 (удивился сильно, резидентного компилятора я не запускал; может он сам?).