¿Cómo puede ser esto src vs. árbol de construcción comparación marca de tiempo será más rápido?

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

Pregunta

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

Se muestra todos los archivos de Java en el árbol de fuentes; entonces, para cada uno, que elimina el sufijo ".java" (cut -d '.' -f2 porque la producción find . se prefija con .). A continuación, utiliza -nt para probar si el archivo Java en el árbol de fuentes es más reciente que el archivo de clase correspondiente en el árbol de construcción; si es más reciente, es la salida. [Javac puede utilizar esta compilar sólo los archivos necesarios src, en lugar de utilizar ant o make]

El problema es que es demasiado lento, teniendo aproximadamente 275ms. Cómo hacerlo más rápido?

O hay una manera más rápida de hacer esto en bash? No puedo ver cómo hacerlo con find, diff, rsync ni make (que no parece atravesar árboles automáticamente y necesidades enumeradas explícitamente archivos de origen).

¿Fue útil?

Solución

intente lo siguiente:

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

Otros consejos

No sé si esta estructura sería más rápido, pero podría valer la pena probar:

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 probablemente no proporcionará ningún impulso. El if colapsado puede. La expresión regular podría ofrecer una pequeña contribución.

Como se ha averiguado, la eliminación de una llamada a cut ha hecho la mayor diferencia.

ant realiza la lógica edificio inteligente, no va a construir una clase a menos que se modificó la fuente.

También te mirar en scons que no es una herramienta de construcción Java nativa, pero es muy útil en la compilación de árboles elaborar complejos eficientes y tiene constructor de Java también.

La adopción del enfoque kon a la munging nombre del archivo, mejora la velocidad de 320ms a 45 ms de media. Gracias 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

El original es un poco más lento ahora (WAS 275ms; ahora 320ms); No sé por qué. Estoy usando la misma línea. Tal diferentes fuentes del sistema después de la reproducción de un vídeo.

editar re el comentario de primera: mangling la "src /" de distancia en lugar de cd src; ... cd -;. Tenga en cuenta que tanto $n y $n2 se utilizan [No puede anidar el $ {var / A / B} construir, se puede?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top