さて、今年もやってまいりました!
DIコンテナの頂上決戦、IoC Battle in 2017!!
さて、今回も最強の挑戦者たちが(ry
冗談です(´・ω・`)
ちょっとUnity死亡説があった為、IoCコンテナの情報を整理していたらこんな記事を見つけました。
IoC Battle in 2015 results: Using Ninject – think again! | CardinalCore
しかも、Githubにパフォーマンス測定コードがあるじゃないですか?
という訳で、GithubをフォークしてNuGetを最新に更新し破壊的変更で動かないところを直しパフォーマンスを測定した最新情報が以下のとおりです。
Unityの性能を100%としたときの評価グラフです。
SimpleInjector最強!わーぱちぱち~!!
ただし、今回の評価は単純性能のみの比較になっています。
機能性の面での評価はしていませんので、ご注意ください。
という訳で、詳細な説明は以下のとおりです。
前提条件
- Windows 10 64bit
- Core i7-4770
- メモリ32G
- .NET Framework4.6.1
評価内容
- Singlton時のコンテナ登録時間
- Singlton時のインスタンス取得時間(100万インスタンス)
- インスタンス都度生成時のコンテナ登録時間
- インスタンス都度生成時のインスタンス取得時間(100万インスタンス)
評価結果
以下が評価結果です。
数値はミリ秒になります。
Container | Singleton - Registartion[ms] | Singleton - Resolve[ms] | Transient - Registartion[ms] | Transient - Resolve[ms] |
---|---|---|---|---|
new Operator | 0.04 | 34.04 | 0.07 | 117.87 |
AutoFac | 4.40 | 353.51 | 0.72 | 13,719.62 |
AutoFac Lambda | 41.16 | 382.45 | 2.46 | 5,296.21 |
StructureMap | 36.33 | 595.89 | 1.42 | 3,444.36 |
SimpleInjector | 24.56 | 76.77 | 2.14 | 204.96 |
Unity | 24.09 | 647.89 | 0.40 | 14,918.55 |
Ninject | 30.89 | 2,605.42 | 1.15 | 141,453.45 |
Castle Windsor | 89.22 | 318.09 | 9.15 | 24,753.04 |
ざっくり分けると性能的には
- ぶっちぎり!?
- SimpleInjector
- 第二集団
- Castle Windsor
- AutoFac Lambda
- StructureMap
- Unity(ただし都度生成はやや遅い)
- 忍者とは言えないんじゃないか?集団
- Ninject
という感じです。
とはいえ、Resolveは100万インスタンス作成時なので、「PC上であれば」気にする問題ではないかもしれません。
動作環境・開発状況比較
Container | Nuget Downloads | Latest Release | Latest Commited | PCL | .NET Standard | Prism |
---|---|---|---|---|---|---|
AutoFac | 3,441,183 | 2016/11/23 | 2017/1/3 | 〇 | 1.1 | 〇 |
StructureMap | 1,522,027 | 2016/11/22 | 2017/1/5 | - | 1.3 / 1.5 | - |
SimpleInjector | 811,212 | 2016/12/2 | 2016/11/27 | 〇 | 1.0 / 1.3 | - |
Unity | 4,900,116 | 2015/10/6 | 2016/5/18 | 〇 | - | 〇 |
Ninject | 3,918,424 | 2014/4/2 | 2016/8/15 | △ | 1.3 / 1.5 | 〇 |
Castle Windsor | 1,326,225 | 2014/5/18 | 2016/11/15 | - | - | - |
Ninjectは去年の夏で更新が止まっています。
Castle Windsorがコミットは最近までされていますが、2年半リリースに至っていないのが気になります。
こう見ると採用候補は
- AutoFac
- StructureMap
- SimpleInjector
辺りに絞られます。
StructureMapはPCLに対応していないのが惜しい!でも.NET Standardには対応しています。
総括
とりあえず、Unityが不安なPrismユーザーはAutoFacおすすめです。
個人的にはSimpleInjectorが気になります。
Prism.SimpleInjector.Forms作っちゃおうかな。。。
え?
Done!は良いとして、誰だよこんなに節操なくコンテナ対応したのw テンプレートもやり給えw pic.twitter.com/72BV8UpzCw
— nuits.jp (@nuits_jp) January 9, 2017
まぁ実際のところ、時間的余裕がないので、作るにしても優先度は低い事でしょう。。。
という訳で今回はここまで。
それではまた!