概要
lsr は、独自のIOライブラリ ourio と io_uring を活用した超高速lsコマンド実装。 従来のlsや他の代替ツールと比較して システムコール数が桁違いに少ない。 Zig言語 や StackFallbackAllocator を用いて更なる最適化を実現。 ベンチマーク で示される圧倒的な性能とコンパクトなバイナリサイズ。 tangled.sh で開発・公開、フィードバックやアイコンリクエスト歓迎。
lsr: 超高速lsコマンドの誕生
- lsr は、ls(1)コマンドの機能を ourio ライブラリで再実装した高速版ツール。
- io_uring を徹底活用し、I/O処理のほとんどを カーネル空間で非同期化。
- 既存のlsやeza、lsd、uutils lsより 圧倒的に高速・低オーバーヘッド を実現。
ベンチマーク結果
-
hyperfine を用いたディレクトリ内ファイル数nごとの測定。
- n=10, n=100, n=1,000, n=10,000で比較。
-
lsr の実行時間は他ツールの 1/2〜1/10 程度。
-
strace -c によるシステムコール数も 桁違いに少ない。
- 例: n=10,000でlsrは 848回、lsは 30,396回。
lsrの内部構造
- プログラムは 3段階構成 :
- 引数解析
- データ収集( I/Oのほぼ全て)
- データ表示
- ディレクトリオープン、stat、lstat、各種ファイル読み出し を全て io_uring経由 で実施。
- stat呼び出しをバッチ化 し、システムコール回数を大幅削減。
メモリアロケーションと最適化
- Zig stdlib StackFallbackAllocator を利用。
- 1MBの固定メモリ を先行確保、不足時のみ他アロケータへフォールバック。
- mmap等のシステムコールも削減。
- libc非依存、動的リンク不要 の静的バイナリ。
- GNU lsよりも小さい: ReleaseSmallビルドで 138.7KB (lsは 79.3KB)。
他ツールとの比較・考察
- lsd は各ファイルごとに clock_gettime を5回程度呼び出しており、詳細は不明。
- uutils ls はsyscall数は少ないが、 ソート処理 がボトルネック。
- lsrも 30%程度の時間をソート に費やすが、それでも高速。
- io_uringの威力 を実感できる好例。
- サーバー用途など、他分野でも 大幅な効率化の可能性。
開発・コントリビュート情報
- tangled.sh を利用して開発・公開。
- バグ報告やアイコンリクエストは atprotoアカウント+appパスワード で誰でも可能。
- リポジトリ や詳細は下記リンク参照。
- https://tangled.sh/@rockorager.dev/lsr
まとめ
- lsr はls互換の超高速ツールで、 io_uring と ourio による徹底的な最適化が特徴。
- システムコール削減・高速処理・小型バイナリ の三拍子。
- 今後のサーバーや高性能I/Oツール開発への示唆 を与えるプロジェクト。