Linux向け C/POSIX 標準ライブラリ実装の比較
(etalabs.net)1. プロジェクト概要と目的
Eta Labs は、Linux 向け C/POSIX 標準ライブラリ実装を、機能性と軽量性(“bloat”)を中心に比較した。比較対象は musl、uClibc、dietlibc、glibc で、今後は bionic および BSD libc も追加される予定。
2. メモリ使用量と軽量性の比較(Bloat)
muslとdietlibcは非常に軽量で、小さな実行ファイルを作成できる(static hello: 13k vs glibc の 662k)。glibcは全体の.soサイズが 7.9M に達し最も重いが、iconv など多くの機能を含む。- uClibc は多くの選択的機能を含めた状態でテストされた。
3. リソース不足時の対応
muslは失敗を明確に報告し、異常終了せずに処理できる場合が多い。glibcとuClibcは、メモリ不足時に abort したり、例外を適切に処理できなかったりする場合がある。dietlibcは一部機能がそもそも未実装、またはごく限定的な処理しか行えない。
4. 性能比較
- glibc はメモリ演算(strchr、memset など)と I/O(
putc/getc)で最高の性能を示す。 - musl はバランスの取れた性能と低いオーバーヘッドを示し、十分に競争力がある。
- dietlibc は
strstr、putc/getc、thread関連の演算で圧倒的に遅い。
5. ABI 安定性とバージョン互換性
muslとglibcは ABI の安定性と互換性を提供するが、シンボルのバージョン管理をサポートするのはglibcのみ。dietlibcとuClibcは全体的に ABI 互換性とバージョン互換性の面で不十分、または非公式である。
6. アルゴリズムと内部実装
muslとglibcは高度な部分文字列検索(twoway)、DFA ベースの正規表現、性能重視の malloc を採用している。dietlibcは naive quicksort や backtracking regex などにより、性能と安定性の面で弱い。- ソートおよびメモリ割り当てアルゴリズムは、glibc が
introsort、ptmallocなどで高度化されている。
7. 機能/標準サポート範囲
glibcはほぼすべての C99/C11 および POSIX 機能をサポートし、ロケール、iconv、デバッグ機能まで幅広い。muslは必須機能に準拠しつつ、小さなサイズで実装されている。dietlibcは大半の機能が不完全または不足しており、POSIX 互換性も低い。
8. アーキテクチャとビルド環境のサポート
muslは主要なアーキテクチャ(x86、ARM、MIPS など)の大半を広くサポートし、non-MMU 環境まで考慮している。- glibc は伝統的に最も広範なサポートを提供しており、広く配布されている。
dietlibcは最小限のアーキテクチャしかサポートせず、移植性とビルドの柔軟性に欠ける。
まだコメントはありません。