Как этот src vs.Сравнение временных меток построения дерева будет быстрее?

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

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

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

Или есть более быстрый способ сделать это в 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 имело самое большое значение.

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

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

Приняв подход kon к изменению имен файлов, скорость в среднем увеличивается с 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top