パフォーマンスについて
昨日、以下のようなマルチスレッドのプログラムをC++のnativeなものとC#の.NETアプリケーションでそれぞれ作成し、パフォーマンスの測定を行いました。
- 一つのスレッドで双方ともnativeなC++でデータを10000個生成し、キューに入れていく
- もう一つのスレッドで、キューに入っているデータを取り出し、そのデータをコンソールに出力を行う。
ここでデータは、.NETアプリケーションではmanagedなクラスを生成しています。
この時、CPUが3.4GHzでメモリが1GBの環境で測定したところ以下の結果がでました。
- native C++
- 約6秒
- .NETアプリケーション
- 約2秒
つまり、C#で書いた方が実行速度が速いことになります。さすがに驚きました。たぶん、.NET framework上で動作するアプリケーションはVMが動的に最適化を行える余地がある分早くなるのだとは思いますが、こんな結果になるとは思っていませんでした。やっぱり、.NETも悪くないですね。
測定結果に一つ問題があるとすれば、私のスキル不足かな?マルチスレッドプログラムなので、変な待ち合わせをしていたりするとパフォーマンス落ちるかもしれませんね。でも、これだけ差が出るのはmangedかunmanagedかの違いだと思われます。
補足
当然、nativeのC++でもメモリの確保などを自前で実装すれば同じ速度は出せるでしょう。でも、それをするためには複雑な実装が必要になります。.NETで書いたものはそんな実装をせずにも、その辺りを後で自動的に最適化できてしまうのが強い理由ですね。