Hi Richard,
I am working on this issue.
The thing which speeds up DirectoryScanner is if you know that your files
are in specific directories
for instance in src/org/tools/doit
<javac>
<include name="src/org/tools/doit/**/*.java"/>
</javac>
Patternsets are used to check whether the files are OK, but do not speed up
searches.
Cheers
Antoine
----- Original Message -----
From: "Richard Evans" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, July 11, 2003 1:04 PM
Subject: Speed up patternsets/DirectoryScanner?


> I've got a build.xml with a long list (several hundred) of java files to
> compile (the tree has some old files I don't compile).
>
> The list is something like:
>
>   <patternset id="src">
>     <include name="file1.java"/>
>     <include name="file2.java"/>
>     ...
>   </patternset>
>
> I find that ant is very slow because the javac task scans the directory
tree
> and then does a linear search through all the entries in the patternset to
see
> if any match the file.
>
> In the case where all the patternset entries are names with no wild cards,
it
> seems that DirectoryScanner can be speeded up by using a hash lookup.
>
> A possible patch against the file in the 1.6alpha version is below.  Is
this
> completely off the wall?  Alternatively, is there a faster way of doing
what I
> want?
>
> Richard Evans
>
> --- DirectoryScanner.java.orig Fri Jul 11 11:59:46 2003
> +++ DirectoryScanner.java Thu Jul 10 11:42:55 2003
> @@ -57,6 +57,8 @@
>  import java.io.File;
>  import java.io.IOException;
>  import java.util.Vector;
> +import java.util.HashSet;
> +import java.util.Set;
>  import org.apache.tools.ant.types.Resource;
>  import org.apache.tools.ant.types.ResourceFactory;
>  import org.apache.tools.ant.types.selectors.FileSelector;
> @@ -213,6 +215,7 @@
>
>      /** The patterns for the files to be included. */
>      protected String[] includes;
> +    private   Set fastincludes = null;
>
>      /** The patterns for the files to be excluded. */
>      protected String[] excludes;
> @@ -519,8 +522,10 @@
>       */
>      public void setIncludes(String[] includes) {
>          if (includes == null) {
> -            this.includes = null;
> +            this.includes     = null;
> +     this.fastincludes = null;
>          } else {
> +     boolean fast = true;
>              this.includes = new String[includes.length];
>              for (int i = 0; i < includes.length; i++) {
>                  String pattern;
> @@ -530,7 +535,20 @@
>                      pattern += "**";
>                  }
>                  this.includes[i] = pattern;
> + if (fast && pattern.indexOf('*') >= 0)
> +   fast = false;
> +
>              }
> +
> +     // Optional fast include lookup if no pattern contains '*'
> +
> +     if (fast) {
> +         fastincludes = new HashSet();
> +
> + for (int i = 0; i < this.includes.length; i ++)
> +   fastincludes.add(isCaseSensitive ? this.includes[i] :
this.includes[i].toLowerCase());
> +     }
> +
>          }
>      }
>
> @@ -806,6 +824,11 @@
>       *         include pattern, or <code>false</code> otherwise.
>       */
>      protected boolean isIncluded(String name) {
> +        // Fast lookup if possible
> +
> +        if (fastincludes != null)
> +   return(fastincludes.contains(isCaseSensitive ? name :
name.toLowerCase()));
> +
>          for (int i = 0; i < includes.length; i++) {
>              if (matchPath(includes[i], name, isCaseSensitive)) {
>                  return true;
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to