/ lsf / BENCHMARKS.md
swadhinbiswas Feat:Moved to Rust · 2/15/2026
a330027
195 lines · 5.1 KB
Raw Download

Benchmarks: lsf vs GNU ls

lsf v5.0.0 (Rust rewrite) vs GNU coreutils ls 9.10

Benchmarked with hyperfine using --shell=none (-N) for accurate sub-millisecond measurement. All tests run with --color=always to enable full ANSI color output on both tools.

System: Linux x86-64


Results Summary

Scenario GNU ls lsf Ratio Winner
Small dir, grid (7 files) 0.75 ms 0.65 ms 0.87x lsf
Large dir, grid (7300 files) 10.2 ms 12.9 ms 1.27x GNU ls
Long format, small dir 1.7 ms 1.8 ms 1.06x ~tied
Long format, large dir (7300 files) 18.4 ms 18.3 ms 1.00x ~tied
Single file (-l Cargo.toml) 1.8 ms 1.7 ms 0.94x lsf
Recursive (-R /usr/share/doc/) 17.1 ms 27.1 ms 1.59x GNU ls

lsf adds Nerd Font icons and colored icons to every entry -- GNU ls only adds filename colors. Despite this extra work, lsf matches or beats GNU ls in most scenarios.


Detailed Results

1. Small Directory - Grid View

Listing src/ (7 Rust source files):

Benchmark 1: /sbin/ls --color=always src/
  Time (mean +/- s):     745.8 us +/- 465.4 us
  Range (min ... max):   351.0 us ... 3375.1 us

Benchmark 2: ./target/release/lsf --color=always src/
  Time (mean +/- s):     649.2 us +/- 329.1 us
  Range (min ... max):   399.0 us ... 2437.5 us

Summary: lsf ran 1.15x faster than GNU ls

2. Large Directory - Grid View

Listing /tmp/lsf-bench/ (7300 files: 5000 .txt, 500 dirs, 1800 multi-extension):

Benchmark 1: /sbin/ls --color=always /tmp/lsf-bench/
  Time (mean +/- s):     10.2 ms +/- 3.6 ms
  Range (min ... max):    5.7 ms ... 22.8 ms

Benchmark 2: ./target/release/lsf --color=always /tmp/lsf-bench/
  Time (mean +/- s):     12.9 ms +/- 3.2 ms
  Range (min ... max):    8.5 ms ... 21.5 ms

Summary: GNU ls ran 1.27x faster than lsf

3. Long Format - Small Directory

-lah on src/ (7 files):

Benchmark 1: /sbin/ls -lah --color=always src/
  Time (mean +/- s):     1.7 ms +/- 1.0 ms

Benchmark 2: ./target/release/lsf -lah --color=always src/
  Time (mean +/- s):     1.8 ms +/- 1.1 ms

Summary: ~tied (1.06x)

4. Long Format - Large Directory

-lah on 7300 files:

Benchmark 1: /sbin/ls -lah --color=always /tmp/lsf-bench/
  Time (mean +/- s):     18.4 ms +/- 3.2 ms

Benchmark 2: ./target/release/lsf -lah --color=always /tmp/lsf-bench/
  Time (mean +/- s):     18.3 ms +/- 3.6 ms

Summary: lsf ran 1.01x faster (effectively tied)

5. Single File

-l Cargo.toml:

Benchmark 1: /sbin/ls -l --color=always Cargo.toml
  Time (mean +/- s):     1.8 ms +/- 1.0 ms

Benchmark 2: ./target/release/lsf -l --color=always Cargo.toml
  Time (mean +/- s):     1.7 ms +/- 1.0 ms

Summary: lsf ran 1.09x faster

6. Recursive Listing

-R /usr/share/doc/:

Benchmark 1: /sbin/ls -R --color=always /usr/share/doc/
  Time (mean +/- s):     17.1 ms +/- 3.1 ms

Benchmark 2: ./target/release/lsf -R --color=always /usr/share/doc/
  Time (mean +/- s):     27.1 ms +/- 2.1 ms

Summary: GNU ls ran 1.59x faster

lsf-Only Features

7. Tree View

--tree --depth 3 on /usr/share/doc/:

Benchmark: ./target/release/lsf --tree --depth 3 --color=always /usr/share/doc/
  Time (mean +/- s):     17.2 ms +/- 3.0 ms

Tree view has no GNU ls equivalent. lsf renders a full tree in ~17ms.

8. Icon Overhead

lsf with icons vs without on 7300 files:

With icons:    13.2 ms +/- 3.2 ms
Without icons: 13.3 ms +/- 3.4 ms

Summary: icon lookup adds ~0% overhead (effectively zero)

The icon lookup system is so fast that enabling/disabling icons makes no measurable difference.


Binary Size

Size
lsf binary (stripped, LTO) 935 KB
GNU ls binary ~140 KB

lsf is a single static binary with zero runtime dependencies (no Bash, no Python, no GNU coreutils needed).


How to Reproduce

# Install hyperfine
cargo install hyperfine

# Create test directory (7300 files)
mkdir -p /tmp/lsf-bench
for i in $(seq 1 5000); do touch "/tmp/lsf-bench/file_$i.txt"; done
for i in $(seq 1 500); do mkdir -p "/tmp/lsf-bench/dir_$i"; done
for ext in rs py js ts go c cpp h hpp java rb php css html json yaml toml xml md sh; do
  for i in $(seq 1 100); do touch "/tmp/lsf-bench/sample_${i}.${ext}"; done
done

# Build release binary
cargo build --release

# Run benchmarks
hyperfine --warmup 10 --min-runs 1000 -N \
  '/sbin/ls --color=always src/' \
  './target/release/lsf --color=always src/'

hyperfine --warmup 5 --min-runs 100 -N \
  '/sbin/ls --color=always /tmp/lsf-bench/' \
  './target/release/lsf --color=always /tmp/lsf-bench/'

hyperfine --warmup 10 --min-runs 1000 -N \
  '/sbin/ls -lah --color=always src/' \
  './target/release/lsf -lah --color=always src/'

hyperfine --warmup 5 --min-runs 100 -N \
  '/sbin/ls -lah --color=always /tmp/lsf-bench/' \
  './target/release/lsf -lah --color=always /tmp/lsf-bench/'

hyperfine --warmup 2 --min-runs 10 -N \
  '/sbin/ls -R --color=always /usr/share/doc/' \
  './target/release/lsf -R --color=always /usr/share/doc/'