Como isso pode src vs. árvore de construção comparação timestamp ser mais rápido?
-
12-09-2019 - |
Pergunta
for n in `cd src; find . -name "*.java"; cd -`;
do a=`echo $n | cut -d '.' -f2`;
if [[ src/$a.java -nt build/$a.class ]];
then echo src/$a.java;
fi;
done
Ele lista todos os arquivos java na árvore src; em seguida, para cada uma, remove o sufixo ".Java" (cut -d '.' -f2
porque saída find .
é prefixado com .
). Em seguida, usa -nt
para testar se o arquivo java na árvore src é mais recente que o arquivo de classe correspondente na árvore de construção; se ele é mais recente, é de saída. [Javac pode então usar isso para compilar apenas os arquivos src necessários, em vez de usar ant
ou make
]
O problema é que ele é muito lento, levando cerca de 275ms. Como torná-lo mais rápido?
Ou há uma maneira mais rápida de fazer isso em bash? Eu não posso ver como fazê-lo com find
, diff
, rsync
nem make
(que não parece atravessar árvores automaticamente e necessidades listadas explicitamente arquivos de origem).
Solução
tente o seguinte:
for f in src/*.java; do
file=`basename $f`;
if [[ src/$file -nt build/${file//.java/} ]]; then
echo src/$file;
fi;
done
Outras dicas
Eu não sei se esta estrutura seria mais rápido, mas pode valer a pena tentar:
while read n
do
# capture the basename all at once
[[ $n =~ src/(.*)\.java ]] # escape the parentheses for Bash < 3.2 (or thereabouts)
[[ $n -nt "build/${BASH_REMATCH[1]}.class" ]] && echo $n
done < <(find src -name "*.java")
A forma while
provavelmente não vai fornecer qualquer impulso. O colapso pode if
. A regex pode fornecer uma pequena contribuição.
Como você descobriu, eliminando uma chamada para cut
fez a maior diferença.
executa formiga lógica inteligente edifício, não vai construir uma classe, a menos que a fonte foi modificado.
Você também pode gostar de olhar para scons que não é uma ferramenta nativa de construção Java, mas é muito útil na compilação de árvores construir complexo eficientes e tem java construtor também.
Adotando a abordagem de kon ao munging nome do arquivo, a velocidade melhora de 320ms para 45ms em média. Graças kon!
for n in `cd src; find . -name "*.java"; cd -`; do
if [[ src/$n -nt build/${n/.java/.class} ]];
then echo src/$n;
fi;
done
O original é um pouco mais lento agora (foi 275ms; agora 320ms); Eu não sei por quê. Eu estou usando a mesma linha. Talvez diferentes fontes sistema após a reprodução de um vídeo.
Editar re do primeiro comentário: desconfiguração do "src /" longe em vez de cd src;
... cd -;
. Note-se que tanto $n
e $n2
são usados ??[você não pode ninho $ {var / A / B} construção, pode?]
for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done