繁体   English   中英

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

[英]How can this src vs. build tree timestamp comparison be faster?

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。 如何使其更快?

还是有更快的方法来执行此操作? 我看不到如何使用finddiffrsyncmake (它似乎不会自动遍历树,并且需要明确列出的源文件)。

尝试这个:

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可能的if ,崩溃了。 正则表达式可能会贡献很小。

正如您所发现的,消除cut的作用最大。

采用kon的方法来处理文件名,平均速度从320ms提高到45ms。 谢谢你!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM