Come può questo src vs. build tree confronto timestamp essere più veloce?
-
12-09-2019 - |
Domanda
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
E 'elenca tutti i file Java nell'albero src; poi per ognuno, rimuove il suffisso ".java" (cut -d '.' -f2
perché uscita find .
è preceduto .
). Viene quindi utilizzato -nt
per verificare se il file java nell'albero src è più recente del file di classe corrispondente nella albero di compilazione; se è più recente, è uscita. [Javac può quindi utilizzare questo per compilare solo i file src necessari, invece di utilizzare ant
o make
]
Il problema è che è troppo lento, prendendo circa 275ms. Come per renderlo più veloce?
O c'è un modo più veloce per fare questo in bash? Non riesco a vedere come si fa con find
, diff
, rsync
nè make
(che non sembra attraversare automaticamente gli alberi, e ha bisogno esplicitamente elencati i file di origine).
Soluzione
provare questo:
for f in src/*.java; do
file=`basename $f`;
if [[ src/$file -nt build/${file//.java/} ]]; then
echo src/$file;
fi;
done
Altri suggerimenti
Non so se questa struttura sarebbe più veloce, ma potrebbe essere la pena di provare:
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")
La forma while
probabilmente non fornirà alcun impulso. Il if
compresso può. La regex potrebbe fornire un piccolo contributo.
Come hai scoperto, eliminando una chiamata a cut
ha fatto la differenza più grande.
formica esegue logica intelligente dell'edificio, non costruire una classe meno che l'origine è stata modificata.
Ti potrebbe piacere anche a guardare in scons, che non è uno strumento di generazione Java nativo, ma è molto utile alla compilazione efficienti alberi costruire complessi e ha costruttore java pure.
Adottando l'approccio di kon al munging nome del file, la velocità migliora da 320ms a 45ms in media. Grazie 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
L'originale è un po 'più lento ora (era 275ms, ora 320ms); Non so perché. Sto utilizzando la stessa linea. Forse diverse fonti del sistema dopo la riproduzione di un video.
Modifica re commento di prima: pressare il "src /" lontano invece di cd src;
... cd -;
. Si noti che sia $n
e $n2
sono utilizzati [non è possibile nido il $ {var / A / B} costruire, si può?]
for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done