我们的一位开发人员将其放在Global.asax代码中,head
方法:
Application_Start
当我在Visual Studio中运行Performance Profiler时,它被识别为“热门路径”。
我对此很新,并且想知道为什么这会导致放缓。
答案 0 :(得分:2)
这看起来像是一些自动创建代码,用于具有在Web应用程序域中实现IClassId接口的默认构造函数的类。
这是使用反射来获取所有这些类的实例并将它们存储在数组中。所以,是的,这可能是缓慢的或超慢的,这取决于有多少类满足这些条件。
这不是繁重的测试,但我认为它会说明问题。我创建了一个新的空项目,创建了IClassId
界面并测量了平均运行时间。我甚至没有任何实现接口的类,所以结果集将为空:
protected void Application_Start()
{
//measure the running time
var stopWatch = new Stopwatch();
stopWatch.Start();
IEnumerable<object> result = from t in AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
where t.GetInterfaces().Contains(typeof(IClassId)) &&
t.GetConstructor(Type.EmptyTypes) != null
select Activator.CreateInstance(t) as IClassId;
List<IGrouping<Guid, object>> lst = result.GroupBy(x => ((IClassId)x).ClassId)
.Where(y => y.Count() > 1)
.ToList();
stopWatch.Stop();
var elapsed = stopWatch.ElapsedMilliseconds;
}
平均花费500毫秒来运行这段代码没有实现,也没有其他程序集加载到我的应用程序域而不是默认的VS项目模板程序集。然而,其中只有少数几个。在我的情况下大约28000。你也可以这样做,看看你有多少:
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).Count();
结论:
我建议不要使用此代码,而是设置一个合适的IoC容器,这样可以根据需要创建实例,并在需要时将其注入构造函数,而不是在应用程序启动期间创建所有实例。