Comment cette comparaison d'horodatage de l'arbre de construction src contre peut être plus rapide?

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

Question

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

Il répertorie tous les fichiers Java dans l'arborescence src; puis pour chacun d'eux, il supprime le suffixe « .java » (cut -d '.' -f2 parce que la production de find . est préfixé avec .). Il utilise ensuite -nt pour tester si le fichier java dans l'arborescence src est plus récent que le fichier de classe correspondante dans l'arborescence de construction; si elle est plus récente, il est sortie. [Javac peut alors l'utiliser pour compiler uniquement les fichiers src nécessaires, au lieu d'utiliser ant ou make]

Le problème est qu'il est trop lent, prenant environ 275ms. Comment le rendre plus rapide?

Ou est-il un moyen plus rapide de le faire en bash? Je ne vois pas comment le faire avec find, diff, ni rsync make (qui ne semble pas traverser les arbres automatiquement, et les besoins des fichiers source répertoriés explicitement).

Était-ce utile?

La solution

essayez ceci:

for f in src/*.java; do 
  file=`basename $f`; 
  if [[ src/$file -nt build/${file//.java/} ]]; then 
     echo src/$file; 
  fi; 
done 

Autres conseils

Je ne sais pas si cette structure serait plus vite, mais il pourrait être la peine d'essayer:

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")

Le formulaire de while ne sera probablement pas fournir tout coup de pouce. Le if peut affaissée. Le regex pourrait fournir une petite contribution.

Comme vous l'avez découvert, ce qui élimine un appel à cut a fait la plus grande différence.

ant effectue la logique de construction intelligente, il ne construira pas une classe à moins que la source a été modifiée.

Vous pourriez également à se pencher sur scons qui n'est pas un outil Java version native, mais est très pratique à la compilation des arbres de construction complexes efficaces et ne dispose constructeur de java ainsi.

L'adoption de l'approche de kon au nom du fichier munging, la vitesse améliore de 320ms à 45ms en moyenne. Merci 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'original est un peu plus lent maintenant (a 275ms, 320ms maintenant); Je ne sais pas pourquoi. J'utilise la même ligne. Peut-être que différentes sources de système après lecture d'une vidéo.

EDIT re commentaire de première: le mutiler "src /" loin au lieu de cd src; ... cd -;. Notez que les deux $n et $n2 sont utilisés [vous ne pouvez pas imbriquer le $ {var / A / B} construire, pouvez-vous?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top