[英]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文件,而不是使用ant
或make
。
问题是它太慢了,大约需要275ms。 如何使其更快?
还是有更快的方法来执行此操作? 我看不到如何使用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
可能的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.