有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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]

问题是速度太慢,大约需要275毫秒。如何使它更快

或者在bash中有没有更快的方法?我看不出如何使用finddiffrsyncmake(它似乎不会自动遍历树,并且需要明确列出的源文件)


共 (4) 个答案

  1. # 1 楼答案

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

    您可能还想了解一下SCON,它不是一个本机Java构建工具,但在编译高效的复杂构建树方面非常方便,而且也有Java builder

  2. # 2 楼答案

    试试这个:

    for f in src/*.java; do 
      file=`basename $f`; 
      if [[ src/$file -nt build/${file//.java/} ]]; then 
         echo src/$file; 
      fi; 
    done 
    
  3. # 3 楼答案

    我不知道这种结构是否会更快,但可能值得一试:

    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的调用带来了最大的不同

  4. # 4 楼答案

    采用kon的文件名搜索方法,平均速度从320毫秒提高到45毫秒。谢谢你,康

    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);我不知道为什么。我用的是同一条线。播放视频后可能会有不同的系统源

    编辑重新开始的评论:把“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