どのようにこのSRC対ビルドツリーのタイムスタンプの比較が速くなることができますか?
-
12-09-2019 - |
質問
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
これは、srcツリー内のすべてのJavaファイルを一覧表示します。 (cut -d '.' -f2
出力はfind .
が付いているので、.
)を各1のために、それはサフィックス「の.java」を削除します。その後、SRCツリー内のjavaファイルがビルドツリー内の対応するクラスファイルよりも新しいかどうかをテストする-nt
を使用しています。それが新しい場合、それが出力されます。
ant
またはmake
を使用しての、唯一必要なのsrcファイルをコンパイルするためにこれを使用することができます]
問題は、それが275ms程度取って、遅すぎるということです。より速くそれを作るには?
やbashでこれを行うにはより高速な方法はありますか?私は(自動的にツリーをトラバースしていないようだこれは、明示的に列挙されたソースファイルを必要とする)find
、diff
、rsync
もmake
でそれを行う方法を見ることができません。
解決
この方法を試してください。
for f in src/*.java; do
file=`basename $f`;
if [[ src/$file -nt build/${file//.java/} ]]; then
echo src/$file;
fi;
done
他のヒント
この構造は、任意のより速いだろうかどうかは知りませんが、それは試してみる価値があります:
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")
while
フォームは、おそらく任意のブーストを提供することはありません。折りたたまれif
月。正規表現は、少額の寄付を提供することがあります。
、cut
への呼び出しを除外することが、最大の違いを行っています。
アリは、ソースが変更された場合を除き、それはクラスを構築していないだろう、スマートビルディング・ロジックを実行します。
また、ネイティブJavaのビルド・ツールではなく、効率的に複雑なビルドツリーをコンパイルするのに非常に便利ですし、同様にJavaのビルダーを持っているんsconsのに見たいかもしれません。
ファイル名いじるへKONのアプローチを採用し、速度は平均で320msから45msに改善されます。おかげ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
原は今ビット遅い(275msであった;今320ms)。私は理由を知りません。私は、同じ回線を使用しています。動画を再生した後、多分、異なるシステムソースます。
の編集の最初のコメント再: "SRC /" 離れ代わりcd src;
の... cd -;
をマングリング。 [あなたは、あなたが巣$ {VAR / A / B}が構築することはできません?] $n
と$n2
の両方が使用されていることに注意してください。
for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done