这SRC与构建树时间戳比较如何能够更快?
-
12-09-2019 - |
题
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。如何使它更快吗?
或者是有一个更快的方式在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
呼叫做出的最大区别。
蚁执行智能建筑逻辑,它不会建立一个类除非源已被修改。
您也可能想看看scons的是不是一个原生的Java构建工具,但是是非常方便的在编译高效复杂的构建树木确实有Java的建设者为好。
采用Kon的方法的文件名改写(munging),速度提高了从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
原来是有点慢现在(是275ms;现在320ms);我不知道为什么。我使用的是同一条线路。也许不同系统资源播放视频之后。
修改的重新RST的评论:重整的 “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
不隶属于 StackOverflow