OS毎のシステムコール実行性能 〜 その6(まとめ)
幾つかのシステムコールの実行性能をOS毎に計測して、「Mac OS X 上では、予想通りシステムコール実行性能が低めでした」という結論でサックリ終わる予定だったのですが、実際に計測してみると、思った以上に色々なバリエーションがあったため、予想外に内容が膨らんでしまい、今回を含めて6回にも渡るエントリになってしまいました。
とりあえずは、ある程度の傾向が掴めたので、今回のまとめをもって、一連のエントリは一旦終わりにしようと思います。
- その1: fork, execve の性能計測
- その2: vfork の性能計測
- その3: fstat, lstat の性能計測
- その4: getpid, gettimeofday の性能計測
- その5: time, umask の性能計測
- その6: まとめ
まとめ
本エントリ群での計測結果を、以下にまとめておきます。
まずは、各OSの計測環境は以下の通りです。
---- | MacOSX | Linux | Solaris |
---|---|---|---|
OS 詳細 | Lion (10.7.5) | Debian (2.6.32-5) | OpenIndiana (151.a2) |
CPU | Core i5 2415M (2.3GHz) | Core i5 2410M (2.3GHz) | |
利用可能コア/スレッド数 | 4 | 2 | |
メモリ | 16GB | 2GB | |
インストール形態 | ベアメタル | 仮想環境 (VirtualBox on Windows7 64bit) |
そして、システムコール毎の計測結果は以下の通りです。
システムコール毎の計測結果を比較しやすいように、全ての「0x4000000 =約6千7百万回分の所要時間(単位:秒)」に正規化しました。
計測時の繰り返し回数が 0x10000 だったものに関しては、単純に計測値を 1024 倍していますので、あくまで傾向把握のための参考数値と考えてください。まぁ、仮想環境上での簡易計測の時点で、読む方も厳密性は期待していないとは思いますが……
---- | MacOSX | Linux | Solaris | 備考 |
---|---|---|---|---|
execve | 160962.56 | 22548.48 | 40355.84 | |
fork | 28016.64 | 9574.40 | 24903.68 | |
vfork | 532.48 | 6174.72 | 5816.32 | Mac OS X では、呼び出し元のスレッドを流用 |
fork + execve | 199577.60 | 31805.44 | 69672.96 | |
vfork + execve | 165754.88 | 26173.44 | 52336.64 | |
fstat | 31.12 | 8.36 | 62.13 | |
lstat | 51.18 | 27.41 | 165.26 | |
gettimeofday | 2.86 | 250.78 | 32.94 | Mac OS X では(基本的に)システムコール実施なし |
time | 13.30 | 243.82 | 26.39 | Mac OS X では、(基本的に)システムコール実施なし、浮動小数点演算環境の保存あり |
umask | 11.61 | 3.61 | 23.70 | |
getpid | ---- | ---- | 21.78 | Solaris 以外は、2回目以降のシステムコール実施を抑止 |
今回の計測対象における全般的な傾向としては、システムコールの実行性能は「Linux < Mac OS X」なのですが、gettimeofday
や time
なので逆転しているあたりが面白いところですね。vfork
の件もありますから、「システムコール所要時間は Linux < Mac OS X」といった予断は、持たないようにした方が良さそうです。
また今回は、read
や write
のようなファイル I/O、ファイルの生成・削除・改名といったディレクトリエントリ操作などは、計測対象から除外しましたが、いずれはイコールコンディションに近い状態(=ベアメタルなインストール)を作って、比較してみたいところではあります。