이 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
5월. REGEX는 작은 기여를 제공 할 수 있습니다.
당신이 알았 듯이, 전화를 제거합니다 cut
가장 큰 차이를 만들었습니다.
개미는 스마트 빌딩 로직을 수행하며 소스가 수정되지 않으면 클래스를 구축하지 않습니다.
네이티브 Java 빌드 도구가 아닌 스콘을 살펴보고 효율적인 복잡한 빌드 트리를 컴파일하는 데 매우 편리하며 Java Builder도 있습니다.
Filename Munging에 대한 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
원본은 이제 약간 느립니다 (275ms; 현재 320ms). 왜 그런지 모르겠어요. 같은 줄을 사용하고 있습니다. 비디오를 재생 한 후 다른 시스템 소스 일 수 있습니다.
편집하다 Re 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