Linq查询减缓全球Asax

时间:2017-05-22 18:28:01

标签: c# asp.net performance linq

我们的一位开发人员将其放在Global.asax代码中,head方法:

Application_Start

当我在Visual Studio中运行Performance Profiler时,它被识别为“热门路径”。

我对此很新,并且想知道为什么这会导致放缓。

1 个答案:

答案 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容器,这样可以根据需要创建实例,并在需要时将其注入构造函数,而不是在应用程序启动期间创建所有实例。