كيف يمكن أن تكون هذه SRC مقابل Build Tree TreeStamp ستكون أسرع؟
-
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
يسرد جميع ملفات Java في شجرة SRC؛ ثم لكل واحد، فإنه يزيل لاحقة ".java" (cut -d '.' -f2
لأن find .
الإخراج مسبق .
). ثم يستخدم -nt
لاختبار ما إذا كان ملف Java في شجرة SRC أحدث من ملف الفئة المقابلة في شجرة البناء؛ إذا كان الأحدث، فهو إخراج. [يمكن Javac بعد ذلك استخدام هذا لتجميع ملفات SRC المطلوبة فقط، بدلا من استخدام ant
أو make
]
المشكلة هي أنه بطيء جدا، وأخذ حوالي 275 ميلا. كيف تجعلها أسرع؟
أم أن هناك طريقة أسرع للقيام بذلك في باش؟ لا أستطيع أن أرى كيفية القيام بذلك 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
مايو. قد يوفر Regex مساهمة صغيرة.
كما اكتشفت، والقضاء على مكالمة إلى cut
جعلت الفرق الأكبر.
ينفذ النملة منطق بناء ذكي، فلن يقوم ببناء فئة ما لم يتم تعديل المصدر.
قد ترغب أيضا في النظر في Scons وهي ليست أداة بناء جافا الأصلية ولكنها مفيدة للغاية في تجميع أشجار البناء المعقدة الفعالة ولديها Java Builder أيضا.
تبني نهج Kon في Munging اسم الملف، والسرعة تتحسن من 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 مللي ثانية؛ الآن 320ms)؛ أنا لا أعرف لماذا. أنا أستخدم نفس الخط. ربما مصادر النظام المختلفة بعد لعب الفيديو.
تعديل إعادة صياغة تعليق: تشاجر "SRC /" بعيدا بدلا من cd src;
... cd -;
. وبعد لاحظ أن كلاهما $n
و $n2
يتم استخدامها [لا يمكنك تداها بناء $ {var / a / b / b}، هل يمكنك؟
for n in `find src -name "*.java"`; do
n2=${n/src/}
if [[ $n -nt build/${n2/.java/.class} ]];
then echo $n;
fi;
done