Benchmarks

cwdio performance benchmarks

Measured listing, copy and traversal numbers from the same library code the app ships, with the environment, the method, and what is not measured.

Updated 15 August 2026 View as Markdown

These are the measured numbers for the three operations people feel most — listing a large folder, copying many files and walking a tree — run against the real library packages the application uses, on one machine, five runs each. They are published rather than claimed so the “Electron is slow” question has something to check against; treat them as an order of magnitude, not an absolute.

Results

Generated 2026-06-12 · Windows x64 · Intel Core i7-1165G7 @ 2.80 GHz · Node 25.7 · 3 benchmarks × 5 runs.

BenchmarkWorkloadMedianMeanMinMaxThroughput
Directory listing20,000 entries161.3 ms158.0 ms145.2 ms169.3 ms~124,000 entries/s
Copy throughput64 MiB in 256 files330.8 ms326.5 ms279.2 ms378.6 ms193.4 MiB/s
Recursive traversal256 entries3.1 ms3.1 ms3.0 ms3.4 ms~83,000 entries/s

The listing figure means a 20,000-file folder is enumerated, stat’ed and sorted in about a sixth of a second on a 2020 laptop CPU. The copy figure is many small files (256 KiB each) — the case that punishes per-file overhead — sustained at roughly 190 MiB/s on that machine’s local storage, including the per-file bookkeeping the queue does.

What is measured, and how

  • The library packages, not a mock. The harness drives @cwdio/vfs (listing, traversal) and @cwdio/file-ops (the copy engine and its queue) — the same code the app calls through its services host. There is no separate “benchmark path”.
  • Five runs each, reporting median, mean, min and max, so a single warm-cache outlier cannot flatter the result. The statistics and formatting helpers are unit-tested.
  • Regenerated per release with the harness in the source repository; the environment line above is emitted by the harness itself.

Why Electron is not the bottleneck

cwdio’s interface is Electron. Its data path is not: all file work — listing, copy/move/delete, search, archive reads, remote transfers — runs in a dedicated services process. Bytes move disk-to-disk or socket-to-disk inside that one process as streams with backpressure; the window receives only small control and progress messages, coalesced to a few per second. Nothing is serialised through the renderer to be written back out the other side. That is an explicit architectural decision (recorded as an ADR in the project’s engineering notes), and it is what the numbers above are measuring: Node streams and the filesystem, with the UI out of the way.

Two consequences you can feel: a 10 GB move does not stall the interface, and a crash of the window does not corrupt a copy in flight — the queue is journaled and resumes.

What is not measured

  • Interface paint — how fast a list scrolls, how quickly a panel redraws. Different question, different harness.
  • Cold start. Electron applications pay a fixed startup cost that a native app does not; cwdio does not pretend otherwise and does not measure it here.
  • Network-bound work. SFTP throughput is your link, not cwdio’s code.
  • Your machine. The numbers are machine-specific. Faster storage and CPU move them; a spinning disk or a network share moves them the other way.

Reading them honestly

The point of publishing is not that cwdio is the fastest file manager — a native tool with a tuned listing path may well beat 124,000 entries per second. The point is that the “Electron tax” people expect on the file work does not appear, because the file work is not done in Electron. If you have a scenario where it does appear, open an issue with what you measured; it will be answered with a measurement, not an argument.

Questions

Is cwdio slow because it is Electron?

The parts that touch files are not Electron. Listing, copying, searching and archive reads run in a separate services process that talks to the window only through small control and progress messages; file bytes never pass through the renderer or the IPC bridge. The interface is Electron; the data path is plain Node streams disk-to-disk. The numbers here are what that path measures at.

Can I run the benchmarks myself?

Not today: the harness lives in the private source repository (npm run bench). What is published is the method, the environment and the raw numbers, regenerated with each release. If you can show a scenario where the numbers do not hold, an issue with your measurement is welcome and will be answered with one.

What do the numbers not cover?

Interface paint, cold start, scrolling a huge list, and anything network-bound. They measure the library layer — the code that lists, copies and walks — on one specific machine. Treat them as an order of magnitude, not a promise for your hardware.