代码之家  ›  专栏  ›  技术社区  ›  13ren

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

  •  0
  • 13ren  · 技术社区  · 16 年前
    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

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

    find , diff , rsync 也没有

    4 回复  |  直到 13 年前
        1
  •  1
  •   kon    16 年前

    试试这个:

    for f in src/*.java; do 
      file=`basename $f`; 
      if [[ src/$file -nt build/${file//.java/} ]]; then 
         echo src/$file; 
      fi; 
    done 
    
        2
  •  1
  •   Dennis Williamson    16 年前

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

    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

        3
  •  0
  •   Maxim Veksler    16 年前

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

        4
  •  0
  •   13ren    16 年前

    采用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