I'm worried about the performance of this change Stefan. I'm sure I'm
probably not understanding your change correctly, so I guess I need an
explanations for how your change works.

As my inline comments below state, I'm concerned about the possible
slowdown on large syncs by using DirectoryScanner. Thanks, --DD

> -----Original Message-----
> bodewig     2004/11/09 02:19:52
> 
>   Modified:    src/main/org/apache/tools/ant/taskdefs Sync.java
>                src/main/org/apache/tools/ant/types PatternSet.java
>                src/testcases/org/apache/tools/ant BuildFileTest.java
>   Added:       src/etc/testcases/taskdefs sync.xml
>                src/testcases/org/apache/tools/ant/taskdefs
SyncTest.java
>   Log:
>   Preparations for PR: 21832, in particular unit tests and some
>   refactorings for <sync>
> 
>   Changes to Sync:
>   * use a DirectoryScanner to find orphaned files instead of the
>     recursive algorithm.

>   +    private int[] removeOrphanFiles(Set nonOrphans, File toDir) {
>   +        int[] removedCount = new int[] {0, 0};
>   +        DirectoryScanner ds = new DirectoryScanner();
>   +        ds.setBasedir(toDir);
>   +        Set s = new HashSet(nonOrphans);
>   +        s.add("");
>   +        String[] excls = (String[]) s.toArray(new
String[s.size()]);

The nonOrphans set contains all files to be synced, i.e. it can be quite
large. Instead of taking a copy of the Set just to add the empty string,
couldn't we instead dimension the String array to nonOrphans.size() + 1,
and add the empty string at the end? I believe toArray doesn't care if
the array provided is larger than needed. Avoid the Set copy.

>   +        ds.setExcludes(excls);
>   +        ds.scan();

I guess this is where I'm the most concerned. As I've written above, the
nonOrphans Set will be quite large for large syncs, and even though I
know Antoine optimized DirectoryScanner a lot, I'm doubtful a scanner
with thousands of excludes as fast as a lookup in a Set, as the previous
implementation was.

>   +        String[] files = ds.getIncludedFiles();

This one's minor, but the previous impl also didn't require the
intermediate arrays for files and directories, as it was deleting things
as it went.

>   +        for (int i = 0; i < files.length; i++) {
>   +            File f = new File(toDir, files[i]);
>   +            log("Removing orphan file: " + f, Project.MSG_DEBUG);
>   +            f.delete();
>   +            ++removedCount[1];
>   +        }
>   +        String[] dirs = ds.getIncludedDirectories();

Maybe a comment as to why the for loop operates back to front would be
helpful here.

>   +        for (int i = dirs.length - 1 ; i >= 0 ; --i) {
>   +            File f = new File(toDir, dirs[i]);
>   +            log("Removing orphan directory: " + f,
Project.MSG_DEBUG);
>   +            f.delete();
>   +            ++removedCount[0];
>            }
>            return removedCount;
>        }

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

Reply via email to