On Thursday, 10 November 2022 at 21:27:28 UTC, Ali Çehreli wrote:
On 11/9/22 12:06, Ali Çehreli wrote:

> I am using its sibling 'ftw'

Now that we know that dirEntries works properly, I decided not to use ftw.

However, ftw performs about twice as fast as dirEntries (despite some common code in the implementation below).

dmd -O compiled patched (see below!) version applied to /usr/bin on my desktop
yields:

ftw       : 363 ms, 750 ÎŒs, and 5 [*]
dirEntries: 18 secs, 831 ms, 738 ÎŒs, and 3 [*]

(* = offending units removed)

[...]
    foreach (entry; dirEntries(root, SpanMode.depth)) {
        if (entry.isDir) {
            dirs ~= entry;

        } else {
            entries ~= DirectoryEntry(entry, entry.getSize);
        }

strace reports that entry.getSize invokes stat on the file a second time. Isn't
the stat buf saved in the entry?

This also gives rise for a complication with symlinks pointing to the directory
which contain them:

   $ pwd
   /tmp/k/sub
   $ ln -s . foo
   $ ../direntrybenchmark .
std.file.FileException@8[...]/linux/bin64/../../src/phobos/std/file.d(1150): ./foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo/foo: Too many levels of symbolic links
   [...]

[...]
    if (args.length != 2) {
stderr.writefln!"Please provide the directory to walk:\n\n %s <directory>\n"
            (args[0].baseName);
        return 1;
    }

    const dir = buildNormalizedPath("/home/ali/dlang");

diff --git a/direntrybenchmark.d b/direntrybenchmark.d
index 661df51..a9a5616 100644
--- a/direntrybenchmark.d
+++ b/direntrybenchmark.d
@@ -102,8 +102,9 @@ WalkResult directoryWalk_dirEntries(string root) {
         if (entry.isDir) {
             dirs ~= entry;

-        } else {
-            entries ~= DirectoryEntry(entry, entry.getSize);
+        }
+        else {
+            entries ~= DirectoryEntry(entry, 0);
         }
     }

@@ -133,7 +134,7 @@ int main(string[] args) {
         return 1;
     }

-    const dir = buildNormalizedPath("/home/ali/dlang");
+    const dir = buildNormalizedPath(args[1]);

     auto timings = benchmark!({ directoryWalk_ftw(dir); },
{ directoryWalk_dirEntries(dir); })(10);



Reply via email to