nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

IoC Battle in 2017

さて、今年もやってまいりました!
DIコンテナの頂上決戦、IoC Battle in 2017!!

さて、今回も最強の挑戦者たちが(ry
冗談です(´・ω・`)

ちょっとUnity死亡説があった為、IoCコンテナの情報を整理していたらこんな記事を見つけました。

IoC Battle in 2015 results: Using Ninject – think again! | CardinalCore

しかも、Githubにパフォーマンス測定コードがあるじゃないですか?
という訳で、GithubをフォークしてNuGetを最新に更新し破壊的変更で動かないところを直しパフォーマンスを測定した最新情報が以下のとおりです。
Unityの性能を100%としたときの評価グラフです。

f:id:nuitsjp:20170110224841p:plain

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作っちゃおうかな。。。

え?

まぁ実際のところ、時間的余裕がないので、作るにしても優先度は低い事でしょう。。。

という訳で今回はここまで。
それではまた!