【问题标题】:Code efficiency/optimization代码效率/优化
【发布时间】:2012-09-17 16:15:26
【问题描述】:

不确定这是否是一个正确的问题,但我想我会试一试,看看会弹出什么样的答案。

我们正处于开发阶段,我们正在进行用户验收测试,用户发现有点缺乏的一件事是在选择搜索结果后加载选项卡的速度.我已经实现了日志记录方法,并提出了一些导致感知缓慢的方法和数据检索/操作的罪魁祸首。下面是最大的问题。该方法的目的是选择针对一个保单或任何子保单收到的所有付款,按到期日和付款日期将它们组合在一起,然后返回一个 GroupedClass,它将为整个保单支付的金额相加。我想知道是否有任何方法可以提高效率。我注意到,在使用这些旧的 UniVerse 数据时,如果在使用之前不强制转换 .AsEnumerable(),事情往往会崩溃:

var mc = new ModelContext();
var policy = mc.Polmasts.Find("N345348");
        var payments =
            mc.Paymnts.Where(p => p.POLICY.Contains(policy.ID)).GroupBy(p => new { p.PAYDUE_, p.PAYPD_ }).Select(
                    grp =>
                    new GroupedPayments
                        {
                            PAYPD_ = grp.Key.PAYPD_,
                            PAYDUE_ = grp.Key.PAYDUE_,
                            AMOUNT = grp.Sum(a => a.AMOUNT),
                            SUSP = grp.Sum(a => a.SUSP)
                        }).AsEnumerable().OrderByDescending(g => g.PAYDUE_).Take(3);

【问题讨论】:

  • 对不起,我其实不熟悉这个词?自学成才,第一份工作等等。
  • 如果你想更准确地了解 CPU 时间的去向,试试这个工具,你可以下载一个免费的小道,非常棒 - red-gate.com/products/dotnet-development/…
  • 尝试不使用 Find 而使用 mc.Polmast.Where(x => x.FK == "N345348").First();它为我解决了性能问题。
  • @tschmit007 在实际应用中它是一个 .Where 需要一个文本框输入,我只是将 Find 用于我自己的故障排除应用程序

标签: c# linq


【解决方案1】:

我注意到,在处理这些旧的 UniVerse 数据时,如果在使用之前不强制转换 .AsEnumerable(),事情往往会崩溃

这是你问题的根源。通过说AsEnumerable,您正在强制所有 记录在该点被删除,你排序并取前三个。显然,对于更多数据,这将变得越来越慢。

鉴于您所说的,解决此问题可能很困难。一般来说,LINQ 提供程序提供了不同数量的功能,这些功能可以在服务器上评估,哪些不能。从您上面的评论来看,听起来 LINQ-to-UniVerse 在服务器上做事并不是特别好。

例如,我希望任何优秀的数据库 LINQ 提供程序都能够做到(使用虚构的定义)

context.Products.Where(p => p.Type == 4).OrderBy(p => p.Name)

在服务器上;但是,您上面的代码更加繁重。尝试将其拆分为更小的部分,并确定是否可以让服务器进行排序和Take(3)。最好的办法可能是一个查询(可以在服务器上完成)来获取底部的三个 PAYDUE_ 值,然后另一个来实际获取这些日期的金额,将所有相关记录拉到客户端。

【讨论】:

  • 几个月后回到这个。我们决定每天将 UV 数据提取到 SQL 后备存储中,我们已经消除了 99% 的速度问题,并清理了许多不需要的 AsEnumerable 等
【解决方案2】:

假设您在 SQL Server 上运行,我将启用分析,Linq 习惯于不生成您想要的 SQL。与内存操作相比,速度变慢更有可能是由于 SQL 错误造成的。

【讨论】:

  • 实际上是针对 IBM UniVerse 文件系统运行
  • 所有记录都在内存中了吗?或者是否正在进行某种磁盘 IO。也许尝试将其拆分为不同的语句,因此先执行 where 和 time 它,然后执行 group by 然后 orderby,至少您会知道减速在哪里
猜你喜欢
  • 2012-04-26
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多