AOPのパフォーマンス

S2.NETではRealProxyとDynamicProxyが選択可能なのでパフォーマンスの違いを見てみました。ポイントはDIコンテナの読み込み時間とAOPの割り込みコスト。
こんなサンプルを作成。

using System;
using System.Diagnostics;
using Seasar.Framework.Container;
using Seasar.Framework.Container.Factory;

namespace S2ConsoleApplication3
{
    public interface IMath
    {
        int Add (int x,int y);
    }
    
    public class MathImpl : IMath
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
    
    public class Program
    {
        const string PATH = "App.dicon";
        const int LOOP = 100000;

        static void Main (string[] args)
        {
            try
            {
                Stopwatch sw = new Stopwatch ();
                
                sw.Start();
                SingletonS2ContainerFactory.Init ();
                IS2Container container = SingletonS2ContainerFactory.Container;
                IMath im = container.GetComponent (typeof (IMath)) as IMath;
                sw.Stop();
                
                Console.WriteLine(sw.ElapsedMilliseconds);
                
                sw.Reset();
                sw.Start();                
                for (int i = 0; i < LOOP; ++i)
                    im.Add(i, i);                
                sw.Stop();
                
                Console.WriteLine(sw.ElapsedMilliseconds.ToString());
            }
            finally
            {
                SingletonS2ContainerFactory.Destroy ();
            }
        }
    }
}

/*
 RealProxy
 676
 1821
 */

/*
 DynamicProxy
 798
 138
 */

MathImpl.Add呼び出しに割り込ませています。結果は予想通りRealProxyは実行が遅く、DynamicProxyは起動が遅いです。私が使うのはサーバ側なので起動時に時間が掛かるのは許せそう。DynamicProxyを使おうかな。