作为Unity基础介绍的一部分,我创建了以下控制台应用程序(有点冗长):
测试中使用的类很简单:
- SimpleClass只是一个空的类 - BasicSingletonClass使用通常的双重检查锁定实现单例模式。 - SingletonWithUnity也只是一个空的类,但它被注册在ContainerControlleredLifetimeManager中。
当N越来越高(达到100万)时,我得到的结果表明使用Unity比不使用Unity要慢得多。我曾经认为Unity有一些解析缓存等内容使它更快,特别是在瞬态解析方面。
这是运行性能测试应用程序并将N设置为10,000时的示例结果:
- 测试创建基本对象的性能 基本对象的平均时间为:0.0007 - 测试使用Unity进行瞬态解析的性能 使用Unity进行瞬态解析的平均时间为:0.008 - 测试基本单例的性能 基本单例的平均时间为:0.0012 - 测试Unity单例的性能 Unity单例的平均时间为:0.0033
正如您所看到的,使用Unity会对性能产生影响。我想听听您对背后的情况有何看法以解释这些结果。
提前感谢您!
IUnityContainer container = new UnityContainer();
container.RegisterType<ISimpleClass, SimpleClass>();
container.RegisterType<ISingletonWithUnity, SingletonWithUnity>(new ContainerControlledLifetimeManager());
double N = 10000;
double sum = 0;
Console.WriteLine("Testing performace of a basic new object");
for (int i = 0; i < N; i++)
{
DateTime start = DateTime.Now;
ISimpleClass simpleClass = new SimpleClass();
DateTime end = DateTime.Now;
sum += (end - start).Milliseconds;
}
double average = sum/N;
Console.WriteLine("Average time for basic new object is: " + average);
Console.WriteLine("Testing performance of transient resolve using unity");
sum = 0;
for (int i = 0; i < N; i++)
{
DateTime start = DateTime.Now;
ISimpleClass simpleClass = container.Resolve<SimpleClass>();
DateTime end = DateTime.Now;
sum += (end - start).Milliseconds;
}
average = sum / N;
Console.WriteLine("Average time for transient resolve using unity is: " + average);
Console.WriteLine("Testing performance of basic singleton");
sum = 0;
for (int i = 0; i < N; i++)
{
DateTime start = DateTime.Now;
BasicSingltonClass basicSingltonClass = BasicSingltonClass.Instance;
DateTime end = DateTime.Now;
sum += (end - start).Milliseconds;
}
average = sum / N;
Console.WriteLine("Average time for basic singleton is: " + average);
Console.WriteLine("Testing performance of unity singleton");
sum = 0;
for (int i = 0; i < N; i++)
{
DateTime start = DateTime.Now;
SingletonWithUnity singletonWithUnity = container.Resolve<SingletonWithUnity>();
DateTime end = DateTime.Now;
sum += (end - start).Milliseconds;
}
average = sum / N;
Console.WriteLine("Average time for unity singleton is: " + average);
测试中使用的类很简单:
- SimpleClass只是一个空的类 - BasicSingletonClass使用通常的双重检查锁定实现单例模式。 - SingletonWithUnity也只是一个空的类,但它被注册在ContainerControlleredLifetimeManager中。
当N越来越高(达到100万)时,我得到的结果表明使用Unity比不使用Unity要慢得多。我曾经认为Unity有一些解析缓存等内容使它更快,特别是在瞬态解析方面。
这是运行性能测试应用程序并将N设置为10,000时的示例结果:
- 测试创建基本对象的性能 基本对象的平均时间为:0.0007 - 测试使用Unity进行瞬态解析的性能 使用Unity进行瞬态解析的平均时间为:0.008 - 测试基本单例的性能 基本单例的平均时间为:0.0012 - 测试Unity单例的性能 Unity单例的平均时间为:0.0033
正如您所看到的,使用Unity会对性能产生影响。我想听听您对背后的情况有何看法以解释这些结果。
提前感谢您!