IExpressionインタフェースのヌル実装
評価式のインジェクションのテスト及び、各種実装(Javascript, PowerShell)の性能比較を行うためにIExpressionインタフェースのヌル実装を用意してみた。
public class NullExpression : AbstractDotnetExpression { public NullExpression(string expression) : base(expression) {} protected override object DoEvaluate(IDIContainer container) { return this.expression; } }
見ての通り、ヌル実装なので内部の評価式をそのまま返すだけである。当然だが、このヌル実装が性能でもダントツに速い。アプリケーションの起動時間だけでも、Javascript実装に比べて1.5倍、PowerShell実装に至っては4倍速い。ちなみにPowerShell実装が遅いのは実装そのものよりもスローしている例外に原因がある。RunspaceInvoke#Invokeメソッドは式評価に失敗すると何故か、以下のような大量の例外をスローして大幅に性能を劣化させる。
'System.IO.DirectoryNotFoundException' の初回例外が mscorlib.dll で発生しました。 'System.IO.DirectoryNotFoundException' の初回例外が mscorlib.dll で発生しました。 : : 以下、32回に渡って繰り返し 'System.Management.Automation.CommandNotFoundException' の初回例外が System.Management.Automation.dll で発生しました。 'System.Management.Automation.CommandNotFoundException' の初回例外が System.Management.Automation.dll で発生しました。 'System.Management.Automation.CommandNotFoundException' の初回例外が System.Management.Automation.dll で発生しました。 'System.Management.Automation.PipelineStoppedException' の初回例外が System.Management.Automation.dll で発生しました。 'System.Management.Automation.CommandNotFoundException' の初回例外が System.Management.Automation.dll で発生しました。 'System.Management.Automation.CommandNotFoundException' の初回例外が System.Management.Automation.dll で発生しました。
再起しているのだろうか。この辺がまだRC(Release Candidate)所以。
実際問題、.NETの場合は型コンバータが充実しているので、式評価を諦めて、型変換だけを行うのであればヌル実装でも十分に実用になることが判っている。コンテナが常駐し続けるASP.NETの場合はPowerScript、スマートクライアントの場合はヌル実装という様に、用途に合わせて使い分けるのが良いのかもしれない。