yoshikazuendo
4/8/2014 - 1:34 AM

log4netを各クラスで毎回GetLoggerするか、Context内のLoggerをGetLoggerして使いまわすかでコストの差を見てみた。

log4netを各クラスで毎回GetLoggerするか、Context内のLoggerをGetLoggerして使いまわすかでコストの差を見てみた。

// なぜかWPFで作っているが…。
public partial class Window1 : Window
{
	public Window1()
	{
		InitializeComponent();

		// log4netを各クラスで毎回GetLoggerするか、Context内のLoggerをGetLoggerして使いまわすかで
		// コストの差を検証してみた。
		// 毎回:    76.988K
		// 使い回し:77.484K
		// よって、コストに差はない。
		// あるかと思ったんだけどなあ…。
#if false
		var hoge = new List<Hoge>();
		for (int i = 0; i < 100000; i++)
		{
			hoge.Add(new Hoge(i));
		}
#else
		var hoge2 = new List<Hoge2>();
		var ct = new Context();
		for (int i = 0; i < 100000; i++)
		{
			hoge2.Add(new Hoge2(ct, i));
		}
#endif
	}
}

public class Hoge
{
	private log4net.ILog logger;

	private readonly int id;

	public Hoge(int i)
	{
		this.id = i;
		this.logger = log4net.LogManager.GetLogger(i.ToString());
		this.logger.Info((i + 1).ToString() + "回目のインスタンス作成です。");
	}
}

public class Context
{
	private log4net.ILog logger;
	public log4net.ILog Logger { get { return logger; } set { this.logger = value; } }
}

public class Hoge2
{
	private readonly Context context;
	private readonly int id;

	public Hoge2(Context c, int i)
	{
		this.id = i;
		this.context = c;
		this.context.Logger = log4net.LogManager.GetLogger(i.ToString());
		this.context.Logger.Info((i + 1).ToString() + "回目のインスタンス作成です。");
	}
}