【问题标题】:Linq Query Slowing Down Global Asax [closed]Linq 查询减慢全球 Asax [关闭]
【发布时间】:2017-05-22 18:28:00
【问题描述】:

我们的一位开发人员将其放入 Global.asax 代码中,Application_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();

当我在 Visual Studio 中运行性能分析器时,它被识别为“热路径”。

我对此很陌生,想知道为什么这会导致速度变慢。

【问题讨论】:

  • 您没有提供足够的信息来有效地回答这个问题,但是,仅仅因为某些东西被识别为“热路径”并不意味着它是。这通常与其他方法或扩展有关。增加测试用例覆盖率并评估结果。也就是说,LINQ 通常不是最快的,因为它适用于具有广泛结果的方法。你想找到什么?您可以专门为此编写代码并避免一起使用 LINQ。
  • 此代码将遍历应用程序使用的整个程序集,并在那里搜索包含对象的 IClassId 接口,并查看它是否具有默认构造函数并创建它的实例。如果您有很多程序集,这将需要一段时间。

标签: c# asp.net performance linq


【解决方案1】:

这看起来像是一些具有默认构造函数的类的自动创建代码,该构造函数在 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 容器,以便可以按需创建实例并在需要时将其注入构造函数,而不是在应用程序启动期间全部创建。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多