This was somewhat unexpected to me.
Just ran a test on how long it takes Ninject to instantiate 100.000 objects, and it took over a 1000x longer than making those objects using constructor (2269 ms vs 2 ms). If I’m asking Ninject to return a singletone, it drops down to about 1200 ms.
Yeah, it’s a lot of instances, so it’s not likely to make noticeable difference in real applications, but it’s something worth keeping in mind. When working on a high-volume web site, this can be noticeable.
Here’s the code I used to test, just in case:
class NinjectPerfTest
{
Ninject.IKernel kernel = null;
public NinjectPerfTest()
{
this.InitNinject();
}
private void InitNinject()
{
this.kernel = new Ninject.StandardKernel(new NinjectModule());
}
public void Test()
{
int count = 100000;
DateTime start = DateTime.Now;
for (int i = 0; i < count; i++)
{
IWorker w = this.kernel.Get<IWorker>();
}
Debug.WriteLine(DateTime.Now.Subtract(start).TotalMilliseconds + " ms with ninject");
start = DateTime.Now;
for (int i = 0; i < count; i++)
{
IWorker w = new Worker();
}
Debug.WriteLine(DateTime.Now.Subtract(start).TotalMilliseconds + " ms with constructor");
}
interface IWorker
{
void DoWork();
}
class Worker : IWorker
{
public void DoWork()
{
Console.WriteLine("Working hard");
}
}
private class NinjectModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
this.Bind<IWorker>().To<Worker>().InSingletonScope();
}
}
}