Wie kann der src vs. Build-Tree-Zeitstempel Vergleich schneller sein?
-
12-09-2019 - |
Frage
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
Es listet alle Java-Dateien im src Baum; dann für jeden einzelnen, entfernt es das Suffix „.java-“ (cut -d '.' -f2
weil find .
Ausgang mit .
vorangestellt wird). Es verwendet dann -nt
zu testen, ob die Java-Datei im src Baum neuer als die entsprechende Klassendatei in dem Build-Baum ist; wenn es neuer ist, ist es ausgegeben. [Javac kann dann diese nur die benötigten src-Dateien zu kompilieren, anstelle der Verwendung von ant
oder make
]
Das Problem ist, dass es zu langsam ist, nimmt etwa 275ms. Wie machen es schneller?
Oder gibt es einen schnelleren Weg, dies in bash zu tun? Ich kann nicht sehen, wie es zu tun mit find
, diff
, rsync
noch make
(die nicht auf Bäume zu durchlaufen automatisch scheinen, und muß explizit Quelldateien aufgelistet).
Lösung
versuchen Sie dies:
for f in src/*.java; do
file=`basename $f`;
if [[ src/$file -nt build/${file//.java/} ]]; then
echo src/$file;
fi;
done
Andere Tipps
Ich weiß nicht, ob diese Struktur nicht schneller sein würde, aber es könnte einen Versuch wert sein:
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")
Die while
Form vermutlich jeden Schub nicht bieten. Die kollabierten if
kann. Die Regex könnte einen kleinen Beitrag liefern.
Wie Sie herausgefunden haben, um einen Anruf zu cut
Beseitigung des größten Unterschied gemacht hat.
ant führt intelligente Gebäude Logik, es wird nicht eine Klasse bauen, wenn die Quelle geändert wurde.
Sie können auch in scons aussehen mag, die keine native Java Build-Tool ist aber sehr praktisch, um effizient komplexe Build-Bäume Kompilieren und tut auch Java-Builder haben.
Die Annahme kon Ansatz an den Dateinamen munging, verbessert die Geschwindigkeit von 320 ms bis 45 ms im Durchschnitt. Dank 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
Das Original etwas langsamer jetzt ist (war 275ms, jetzt 320 ms); Ich weiß nicht, warum. Ich bin mit der gleichen Zeile. Vielleicht verschiedenen Systemquellen nach der Wiedergabe eines Videos.
EDIT re ersten Kommentar: das "src /" entfernt statt cd src;
Mangeln ... cd -;
. Beachten Sie, dass beide $n
und $n2
verwendet werden [Sie können nicht verschachtelt werden die $ {var / A / B} konstruieren, können Sie?]
for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done