Как это сравнение сроков и меток времени построения дерева может быть быстрее? - PullRequest
0 голосов
/ 04 декабря 2009
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

В нем перечислены все файлы Java в дереве src; затем для каждого из них удаляется суффикс ".java" (cut -d '.' -f2, потому что вывод find . имеет префикс .). Затем он использует -nt, чтобы проверить, является ли файл Java в дереве src более новым, чем соответствующий файл класса в дереве сборки; если он новее, это вывод. [javac может затем использовать это для компиляции только необходимых файлов src, вместо использования ant или make]

Проблема в том, что она слишком медленная и занимает около 275 мс. Как сделать это быстрее?

Или есть более быстрый способ сделать это в bash? Я не вижу, как это сделать с find, diff, rsync или make (который, кажется, не пересекает деревья автоматически и нуждается в явно перечисленных исходных файлах).

Ответы [ 4 ]

1 голос
/ 04 декабря 2009

Не знаю, будет ли эта структура быстрее, но стоит попробовать:

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 имело самое большое значение.

1 голос
/ 04 декабря 2009

попробуйте это:

for f in src/*.java; do 
  file=`basename $f`; 
  if [[ src/$file -nt build/${file//.java/} ]]; then 
     echo src/$file; 
  fi; 
done 
0 голосов
/ 04 декабря 2009

Муравей выполняет логику умного построения, он не будет строить класс, если источник не был изменен.

Возможно, вам также захочется взглянуть на scons, который не является родным инструментом сборки Java, но очень удобен для компиляции эффективных сложных деревьев сборки и также имеет Java-компоновщик.

0 голосов
/ 04 декабря 2009

Принимая подход Кона к манипулированию именами, скорость увеличивается в среднем с 320 мс до 45 мс. Спасибо, Кон!

for n in `cd src; find . -name "*.java"; cd -`; do
  if [[ src/$n -nt build/${n/.java/.class} ]];
     then echo src/$n;
  fi;
done

Оригинал теперь немного медленнее (было 275 мс; теперь 320 мс); Я не знаю почему. Я использую ту же линию. Возможно, другие системные источники после воспроизведения видео.

РЕДАКТИРОВАТЬ первый комментарий: искажение "src /" вместо cd src; ... cd -;. Обратите внимание, что используются $n и $n2 [вы не можете вложить конструкцию $ {var / A / B}, не так ли?]

for n in `find src -name "*.java"`; do
  n2=${n/src/}
  if [[ $n -nt build/${n2/.java/.class} ]];
     then echo $n;
  fi;
done
...