scala как скриптовый язык
От: dimgel Россия https://github.com/dimgel
Дата: 18.12.13 07:57
Оценка: 12 (1)
Сабж — вполне себе работает и даже шустро. Вот тут захотелось мне на генте увеличить размер кеша 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 (удивился сильно, резидентного компилятора я не запускал; может он сам?).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.