fcoreutils
High-performance GNU coreutils replacement in Rust — 100+ tools, SIMD-accelerated, drop-in compatible, cross-platform.
Independent Test Results (v0.12.5)
Source: AiBrush/coreutils-rs-independent-test — Linux x86_64, GitHub Actions, 100MB file, hyperfine
Summary: 107 tools tracked · 2203/2213 tests passed (99.5%) · 95 tools at 100% · fastest: wc at 33.5x vs GNU
Sizes are stripped release binaries. Compat is GNU test pass rate (skipped tests excluded). Speedup is peak across all benchmark scenarios.
-= no data or not applicable.SKIP= requires root or SELinux, or GNU baseline not available.
| Tool | f* size | GNU size | uutils size | Compat | f* vs GNU | f* vs uutils |
|---|---|---|---|---|---|---|
| arch | 424.9 KB | 34.5 KB | - | ✅ 100% (5/5) | 0.8x | - |
| b2sum | 633.9 KB | 54.5 KB | 2.3 MB | ✅ 100% (25/25) | 1.3x | 1.2x |
| base32 | 445.3 KB | 38.5 KB | - | ✅ 100% (29/29) | 1.4x | - |
| base64 | 558.6 KB | 38.5 KB | 1.3 MB | ✅ 100% (33/33) | 5.6x | 5.7x |
| basename | 429.7 KB | 34.5 KB | - | ✅ 100% (26/26) | 0.8x | - |
| basenc | 458.9 KB | 46.5 KB | - | ✅ 100% (40/40) | 1.1x | - |
| cat | 459.0 KB | 38.5 KB | 1.3 MB | ✅ 100% (46/46) | 2.6x | 1.8x |
| chcon | 458.9 KB | 58.5 KB | - | SKIP | - | - |
| chgrp | 523.9 KB | 58.5 KB | - | ✅ 100% (11/11) | 1.0x | - |
| chmod | 525.5 KB | 54.5 KB | - | ✅ 100% (33/33) | 1.0x | - |
| chown | 528.4 KB | 58.5 KB | - | ✅ 100% (11/11) | 0.9x | - |
| chroot | 464.7 KB | 38.5 KB | - | SKIP | - | - |
| cksum | 450.5 KB | 102.5 KB | - | ✅ 100% (21/21) | 1.2x | - |
| comm | 453.7 KB | 38.5 KB | 1.3 MB | ✅ 100% (30/30) | 3.5x | 3.4x |
| cp | 562.4 KB | 138.5 KB | - | ✅ 100% (18/18) | 1.0x | - |
| csplit | 1.8 MB | 50.5 KB | - | SKIP | 17.6x | - |
| cut | 635.1 KB | 38.5 KB | 1.3 MB | ✅ 100% (49/49) | 5.4x | 1.6x |
| date | 505.2 KB | 106.5 KB | - | ✅ 100% (32/32) | - | - |
| dd | 496.0 KB | 70.5 KB | - | ✅ 100% (17/17) | 0.9x | - |
| df | 540.2 KB | 87.1 KB | - | ❌ 53% (9/17) | - | - |
| dir | 585.5 KB | 139.0 KB | - | SKIP | - | - |
| dircolors | 450.1 KB | 46.5 KB | - | ✅ 100% (14/14) | - | - |
| dirname | 426.5 KB | 34.4 KB | - | ✅ 100% (23/23) | 0.8x | - |
| du | 510.9 KB | 98.5 KB | - | ✅ 100% (23/23) | - | - |
| echo | 426.4 KB | 34.4 KB | - | ✅ 100% (38/38) | 0.8x | - |
| env | 467.4 KB | 46.9 KB | - | ✅ 100% (17/17) | 0.9x | - |
| expand | 453.5 KB | 34.5 KB | 1.3 MB | ✅ 100% (33/33) | 10.4x | 12.9x |
| expr | 1.8 MB | 42.4 KB | - | ✅ 100% (43/43) | 0.9x | - |
| factor | 453.0 KB | 62.5 KB | - | ✅ 100% (26/26) | 0.9x | - |
| false | 297.0 KB | 26.3 KB | - | ✅ 100% (7/7) | - | - |
| fmt | 457.9 KB | 38.5 KB | - | ✅ 100% (18/18) | - | - |
| fold | 445.2 KB | 34.5 KB | 1.3 MB | ✅ 100% (35/35) | 4.8x | 1.5x |
| groups | 428.5 KB | 34.5 KB | - | ✅ 100% (4/4) | 0.8x | - |
| head | 451.9 KB | 42.5 KB | 1.3 MB | ✅ 100% (47/47) | 2.1x | 1.1x |
| hostid | 424.7 KB | 34.5 KB | - | ✅ 100% (6/6) | 0.8x | - |
| id | 433.1 KB | 38.5 KB | - | ✅ 100% (16/16) | 1.1x | - |
| install | 513.4 KB | 142.5 KB | - | ✅ 100% (11/11) | 1.1x | - |
| join | 467.3 KB | 50.5 KB | 2.6 MB | ✅ 100% (35/35) | 1.0x | 1.1x |
| kill | 453.2 KB | 22.4 KB | - | SKIP | - | - |
| link | 430.5 KB | 34.5 KB | - | ✅ 100% (8/8) | 0.9x | - |
| ln | 451.7 KB | 54.5 KB | - | ✅ 100% (16/16) | 0.9x | - |
| logname | 424.7 KB | 34.5 KB | - | ✅ 100% (3/3) | 1.8x | - |
| ls | 586.9 KB | 139.0 KB | - | ✅ 100% (42/42) | - | - |
| md5sum | 626.8 KB | 38.4 KB | 2.3 MB | ✅ 100% (30/30) | 1.0x | 1.2x |
| mkdir | 442.5 KB | 74.5 KB | - | ✅ 100% (17/17) | 1.0x | - |
| mkfifo | 432.3 KB | 42.5 KB | - | ✅ 100% (11/11) | 1.0x | - |
| mknod | 434.4 KB | 42.5 KB | - | ✅ 100% (10/10) | 1.0x | - |
| mktemp | 443.9 KB | 34.5 KB | - | ✅ 100% (15/15) | - | - |
| mv | 474.8 KB | 134.5 KB | - | SKIP | 1.0x | - |
| nice | 457.5 KB | 34.5 KB | - | ✅ 100% (12/12) | 0.9x | - |
| nl | 1.8 MB | 38.6 KB | 2.7 MB | ✅ 100% (47/47) | 4.4x | 1.6x |
| nohup | 455.6 KB | 34.4 KB | - | ✅ 100% (6/6) | 0.9x | - |
| nproc | 444.0 KB | 34.5 KB | - | ✅ 100% (8/8) | 0.8x | - |
| numfmt | 517.0 KB | 58.5 KB | - | ✅ 100% (31/31) | - | - |
| od | 523.2 KB | 70.5 KB | - | ✅ 100% (41/41) | - | - |
| paste | 450.4 KB | 38.4 KB | 1.2 MB | ✅ 100% (30/30) | 2.4x | 18.6x |
| pathchk | 438.7 KB | 34.5 KB | - | ✅ 100% (17/17) | 0.8x | - |
| pinky | 768.6 KB | 38.4 KB | - | ✅ 100% (9/9) | - | - |
| pr | 502.2 KB | 70.6 KB | - | ✅ 100% (19/19) | - | - |
| printenv | 428.4 KB | 34.4 KB | - | SKIP | - | - |
| printf | 493.3 KB | 54.4 KB | - | ✅ 100% (59/59) | - | - |
| ptx | 525.9 KB | 54.5 KB | - | ✅ 100% (10/10) | - | - |
| pwd | 429.2 KB | 34.5 KB | - | ✅ 100% (8/8) | - | - |
| readlink | 439.2 KB | 42.4 KB | - | ✅ 100% (19/19) | 0.8x | - |
| realpath | 443.5 KB | 42.4 KB | - | ✅ 100% (24/24) | 0.8x | - |
| rev | 439.3 KB | 14.4 KB | - | ✅ 100% (32/32) | 21.2x | - |
| rm | 522.7 KB | 58.5 KB | - | ✅ 100% (12/12) | 0.9x | - |
| rmdir | 431.0 KB | 46.4 KB | - | ✅ 100% (12/12) | 0.7x | - |
| runcon | 463.9 KB | 34.5 KB | - | SKIP | - | - |
| seq | 485.9 KB | 50.5 KB | - | ✅ 100% (53/53) | 15.9x | - |
| sha1sum | 616.9 KB | 38.4 KB | - | ✅ 100% (15/15) | 0.8x | - |
| sha224sum | 617.0 KB | 38.4 KB | - | ✅ 100% (10/10) | 0.9x | - |
| sha256sum | 617.8 KB | 38.4 KB | 2.3 MB | ✅ 100% (34/34) | 1.0x | 1.0x |
| sha384sum | 616.9 KB | 38.4 KB | - | ✅ 100% (10/10) | 0.9x | - |
| sha512sum | 617.0 KB | 38.4 KB | - | ✅ 100% (10/10) | 0.9x | - |
| shred | 456.5 KB | 54.5 KB | - | ✅ 100% (10/10) | 2.0x | - |
| shuf | 470.0 KB | 46.5 KB | - | ✅ 100% (27/27) | - | - |
| sleep | 444.4 KB | 34.5 KB | - | ✅ 100% (10/10) | 0.9x | - |
| sort | 1.0 MB | 102.8 KB | 3.2 MB | ✅ 100% (51/51) | 12.1x | 12.1x |
| split | 523.7 KB | 54.9 KB | - | ✅ 100% (22/22) | 1.0x | - |
| stat | 465.5 KB | 86.5 KB | - | ⚠️ 97% (28/29) | - | - |
| stdbuf | 484.4 KB | 50.5 KB | - | ✅ 100% (6/6) | - | - |
| stty | 454.7 KB | 78.5 KB | - | ✅ 100% (4/4) | - | - |
| sum | 439.7 KB | 34.4 KB | - | ✅ 100% (23/23) | 1.3x | - |
| sync | 430.2 KB | 34.4 KB | - | ✅ 100% (5/5) | 0.9x | - |
| tac | 1.9 MB | 38.4 KB | 2.7 MB | ✅ 100% (30/30) | 3.1x | 1.7x |
| tail | 481.5 KB | 62.5 KB | 1.7 MB | ✅ 100% (44/44) | 1.5x | 2.2x |
| tee | 443.4 KB | 38.5 KB | - | ✅ 100% (15/15) | - | - |
| test | 440.5 KB | 46.4 KB | - | ✅ 100% (51/51) | - | - |
| timeout | 486.9 KB | 38.9 KB | - | ✅ 100% (21/21) | - | - |
| touch | 457.8 KB | 94.5 KB | - | ✅ 100% (21/21) | 1.0x | - |
| tr | 696.2 KB | 46.5 KB | 1.3 MB | ✅ 100% (46/46) | 5.5x | 6.0x |
| true | 296.6 KB | 26.3 KB | - | ✅ 100% (8/8) | - | - |
| truncate | 441.2 KB | 38.5 KB | - | ✅ 100% (25/25) | 1.0x | - |
| tsort | 464.7 KB | 46.5 KB | - | ✅ 100% (19/19) | - | - |
| tty | 425.8 KB | 34.5 KB | - | ✅ 100% (6/6) | 0.8x | - |
| uname | 428.6 KB | 34.5 KB | - | ✅ 100% (14/14) | 0.8x | - |
| unexpand | 453.3 KB | 38.5 KB | 1.3 MB | ✅ 100% (26/26) | 4.0x | 2.9x |
| uniq | 907.0 KB | 38.5 KB | 1.3 MB | ✅ 100% (46/46) | 10.3x | 6.0x |
| unlink | 429.4 KB | 34.5 KB | - | ✅ 100% (7/7) | 0.9x | - |
| uptime | 501.2 KB | 14.4 KB | - | ✅ 100% (5/5) | - | - |
| users | 461.2 KB | 34.5 KB | - | ✅ 100% (8/8) | - | - |
| vdir | 585.5 KB | 139.0 KB | - | SKIP | - | - |
| wc | 906.6 KB | 54.5 KB | 1.4 MB | ⚠️ 99% (72/73) | 33.5x | 18.2x |
| who | 782.6 KB | 58.5 KB | - | ✅ 100% (15/15) | - | - |
| whoami | 425.0 KB | 34.5 KB | - | ✅ 100% (4/4) | 0.8x | - |
| yes | 1,853 B | 34.4 KB | - | ✅ 100% (23/23) | 4.1x | - |
Remaining Failures (10)
| Tool | Failed | Cause |
|---|---|---|
| df | 8/17 | Filesystem-dependent sizes (race condition) |
| stat | 1/29 | -f filesystem block counts change between runs |
| wc | 1/73 | GNU 9.4 vs 9.7 word counting model difference |
Installation
Or build from source:
Binaries are in target/release/.
Usage
Each tool is prefixed with f to avoid conflicts with system utilities:
# Word count (drop-in replacement for wc)
|
# Cut (drop-in replacement for cut)
# Hash tools (drop-in replacements)
# Base64 encode/decode
# Sort, translate, deduplicate, reverse
# File viewing and transformation
# Text formatting
# Set operations on sorted files
Key Optimizations
- Zero-copy mmap: Large files are memory-mapped directly, avoiding copies
- SIMD scanning:
memchrcrate auto-detects AVX2/SSE2/NEON for byte searches - stat-only byte counting:
wc -cusesstat()without reading file content - Hardware-accelerated hashing: sha2 detects SHA-NI, blake2 uses optimized implementations
- SIMD base64: Vectorized encode/decode with 4MB chunked streaming
- Parallel processing: Multi-file hashing and wc use thread pools
- SIMD range translate/delete:
trdetects contiguous byte ranges and uses AVX2/SSE2 SIMD - Chunk-based reverse scan:
tacprocesses backward in 512KB chunks with forward SIMD within each chunk - Optimized release profile: Fat LTO, single codegen unit, abort on panic, stripped binaries
GNU Compatibility
Output is byte-identical to GNU coreutils. All flags are supported including --files0-from, --total, --complement, --check, and correct column alignment.
Assembly Optimization Path
We are pursuing a second optimization track alongside Rust: hand-crafted x86_64 assembly for platforms where maximum throughput matters. We started with yes — it is simple enough to implement completely and serves as a proof-of-concept for the approach.
Our assembly yes achieves ~2.6 GB/s (1.89x faster than GNU yes, 1.25x faster than our Rust implementation) while compiling to under 1,900 bytes with no runtime dependencies.
| Binary | Size | Throughput | Memory (RSS) | Startup |
|---|---|---|---|---|
| fyes (asm) | 1,853 bytes | 2,060 MB/s | 28 KB | 0.24 ms |
| GNU yes (C) | 35,208 bytes | 2,189 MB/s | 1,956 KB | 0.75 ms |
| fyes (Rust) | ~435 KB | ~2,190 MB/s | ~2,000 KB | ~0.75 ms |
Benchmarked on Linux x86_64. At pipe-limited throughput all three write at ~2.1 GB/s. The assembly wins on binary size (19x smaller), memory (70x less RSS), and startup latency (3x faster).
On Linux x86_64 and Linux ARM64, releases ship the assembly binary. All other platforms (macOS, Windows) use the Rust implementation. The assembly binary is a static ELF with only two syscalls (write and exit/exit_group), no dynamic linker, and a non-executable stack.
Our priority remains 100% GNU compatibility in Rust first. We will pursue assembly implementations for additional commands over time, as the tooling and verification process matures. The goal is not to rush assembly ports but to do them right — with full security review and byte-for-byte compatibility testing.
See assembly/yes/ for the source and tests/assembly/ for the test suite.
Roadmap
We are actively working toward 100% compatibility with GNU coreutils — byte-identical output, same exit codes, and matching error messages for all 90+ tools. Once we achieve full compatibility, we will focus on performance optimization targeting 10-30x speedup over GNU coreutils across all tools.
Contributing
We welcome contributions! Please see CONTRIBUTING.md for guidelines.
This project follows the Contributor Covenant Code of Conduct.
Architecture
See ARCHITECTURE.md for design decisions and PROGRESS.md for development status.
Security
To report a vulnerability, please see our Security Policy.
License
MIT