Rust's recursive directory iterator 5x faster than CPP

95 points SnooMacaroons3057

Why is rust's WalkDir and jWalk much much faster (\~ 5x and \~7.5x respectively) than the CPP's recursive directory iterator?

System: M1 Max macbook pro

Test: Recursively iterate through all the directories recursively and count the number of files.

Total Files: 346,011

Results -

CPP - 4.473 secs

Rust (WalkDir) - 0.887 secs
Rust (jWalk) - 0.670 secs

Both compiled in release mode -

CPP: gcc ./src/main.cpp -o ./src/output.o -O3

RUST: cargo build --release

CPP code \~ 4.473 secs

#include <filesystem>  
#include <iostream>  
int main(int argc, char **argv) {  
   int count = 0;  
   for (auto &p : std::filesystem::recursive_directory_iterator("../../../")) {  
      count += 1;  
   }  
   std::cout << "Found " << count << " files" << std::endl;  
}

RUST code (walkdir) \~ 0.887 secs

use walkdir::WalkDir;

fn main() {
    let mut count = 0;
    for _ in WalkDir::new("../../../").into_iter() {
        count += 1;
    }
    println!("Found {} files", count);
}

RUST code (jWalk) \~ 0.67 secs

use jwalk::WalkDir;

fn main() {
    let mut count = 0;
    for _ in WalkDir::new("../../../").skip_hidden(false).into_iter() {
        count += 1;
    }
    println!("Found {} files", count);
}

Is there any change you'd suggest for C++ part? I've made it as simple as possible.