这个src与构建树的时间戳比较如何更快?

时间:2009-12-04 11:28:13

标签: java bash makefile timestamp directory-tree

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文件;然后对于每一个,它删除后缀“.java”(cut -d '.' -f2,因为find .输出前缀为.)。然后使用-nt来测试src树中的java文件是否比构建树中的相应类文件更新;如果它更新,则输出。 [javac然后可以使用它来编译所需的src文件,而不是使用antmake]

问题是它太慢了,大概需要275ms。如何让它更快?

或者在bash中有更快的方法吗?我无法看到如何使用finddiffrsyncmake(它似乎不会自动遍历树,并且需要明确列出的源文件) )。

4 个答案:

答案 0 :(得分:1)

试试这个:

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

答案 1 :(得分:1)

我不知道这种结构是否会更快,但值得一试:

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的呼叫已经发挥了最大的作用。

答案 2 :(得分:0)

采用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

现在原来有点慢(是275毫秒;现在是320毫秒);我不知道为什么。我正在使用同一条线。播放视频后可能会有不同的系统来源。

编辑重新评论:将“src /”改为cd src;而不是cd -;$n。请注意,$n2for n in `find src -name "*.java"`; do n2=${n/src/} if [[ $n -nt build/${n2/.java/.class} ]]; then echo $n; fi; done 都被使用[你无法嵌套$ {var / A / B}构造,是吗?]

{{1}}

答案 3 :(得分:0)

ant执行智能构建逻辑,除非源被修改,否则它不会构建类。

您可能还想查看不是本机Java构建工具的scons,但是在编译高效的复杂构建树时非常方便,并且也有java构建器。