どのようにこのSRC対ビルドツリーのタイムスタンプの比較が速くなることができますか?

StackOverflow https://stackoverflow.com/questions/1846383

質問

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を使用しています。それが新しい場合、それが出力されます。

[javacは、代わりにantまたはmakeを使用しての、唯一必要なのsrcファイルをコンパイルするためにこれを使用することができます]

問題は、それが275ms程度取って、遅すぎるということです。より速くそれを作るには?

やbashでこれを行うにはより高速な方法はありますか?私は(自動的にツリーをトラバースしていないようだこれは、明示的に列挙されたソースファイルを必要とする)finddiffrsyncmakeでそれを行う方法を見ることができません。

役に立ちましたか?

解決

この方法を試してください。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top