代码之家  ›  专栏  ›  技术社区  ›  Mike Fielden

在方法中查找性能瓶颈

  •  0
  • Mike Fielden  · 技术社区  · 15 年前

    我有一个特定的问题,我想解决代码中的一个瓶颈,但我想大致知道,将来,我将如何在不必重新发明轮子的情况下快速找到瓶颈发生的位置。

    这是我的方法的代码,但正如我所说,我想知道如何大致了解Linq查询需要多长时间,或者数据表需要多长时间来构建等等。

    public static DataTable GetPivotDataTable(this IQueryable<WbsNumber> table, Months month)
    {
          FmToolDataContext dataContext = new FmToolDataContext();
    
          DataTable dt = new DataTable();
    
          dt.Columns.Add("id", typeof(string));
          dt.Columns.Add("wbsNumber", typeof(string));
          dt.Columns.Add("wbsTitle", typeof(string));
          dt.Columns.Add("number", typeof(string));
          dt.Columns.Add("vendor", typeof(string));
          dt.Columns.Add("programFund", typeof(string));
          dt.Columns.Add("committedAmount", typeof(decimal));
          dt.Columns.Add("obligatedAmount", typeof(decimal));
          dt.Columns.Add("costedAmount", typeof(decimal));
          dt.Columns.Add("costOverObligationsAmount", typeof(decimal));
    
          foreach (WbsNumber wbs in table)
          {
            // Get PRs for this Project Detail
            var prAmounts = dataContext.PrAmounts.Where(_pra => _pra.isCurrent && !_pra.requiresAudit
                                                        && _pra.PrDetail.isActive && _pra.PrDetail.WbsNumber == wbs
                                                                                                        && _pra.Import.fiscalYear == (int)HttpContext.Current.Session["FiscalYear"]);
    
    
    
            foreach(PrAmount pra in prAmounts)
            {
                DataRow row = dt.NewRow();
    
                row["id"] = wbs.id;
                row["wbsNumber"] = wbs.displayString;
                row["wbsTitle"] = wbs.wbsTitlesId != null ? wbs.WbsTitle.name : "(blank)";
                row["number"] = pra.PrDetail.Pr.number;
                row["vendor"] = pra.PrDetail.Pr.GetPrVendorName();
                row["programFund"] = pra.PrDetail.ProgramFund.name;
                row["committedAmount"] = pra.CommittedMonthlyRecord.GetMonth(month);
                row["obligatedAmount"] = pra.ObligatedMonthlyRecord.GetMonth(month);
                row["costedAmount"] = pra.CostedMonthlyRecord.GetMonth(month);
                row["costOverObligationsAmount"] = pra.CostOverObligationsMonthlyRecord.GetMonth(month);
    
                dt.Rows.Add(row);
            }
    
                // Get the P-Cards for this Project Detail
            var pCardAmounts = dataContext.PCardAmounts.Where(_pca => _pca.isCurrent && !_pca.requiresAudit
                                                              && _pca.PCardTransaction.isActive && _pca.PCardTransaction.WbsNumber == wbs
                                                                                                                    && _pca.Import.fiscalYear == (int)HttpContext.Current.Session["FiscalYear"]);
    
            foreach (PCardAmount pca in pCardAmounts)
            {
                DataRow row = dt.NewRow();
    
                row["id"] = wbs.id;
                row["wbsNumber"] = wbs.displayString;
                row["wbsTitle"] = wbs.wbsTitlesId != null ? wbs.WbsTitle.name : "(blank)";
                row["number"] = pca.PCardTransaction.number;
                row["vendor"] = pca.PCardTransaction.bwVendorsId != null ? pca.PCardTransaction.BwVendor.name : "(blank)";
                row["programFund"] = pca.PCardTransaction.ProgramFund.name;
                row["committedAmount"] = pca.CommittedMonthlyRecord.GetMonth(month);
                row["obligatedAmount"] = pca.ObligatedMonthlyRecord.GetMonth(month);
                row["costedAmount"] = pca.CostedMonthlyRecord.GetMonth(month);
                row["costOverObligationsAmount"] = pca.CostOverObligationsMonthlyRecord.GetMonth(month);
    
                dt.Rows.Add(row);
            }
          }
    
        return dt;
    }
    
    4 回复  |  直到 15 年前
        1
  •  2
  •   Justin Niessner    15 年前

    您最好下载一个分析应用程序,比如 Red Gate ANTS Performance Profiler

    它将帮助您确定真正的问题(性能问题并不总是表面上看起来的那样)。

        2
  •  0
  •   Christian13467    15 年前

    分析器是可以帮助您的工具。

    微软有 choice of profiler tools 在MSDN中。红门事件探查器没有列出,但也值得使用。

        3
  •  0
  •   saret    15 年前

    您应该使用性能工具来帮助找到瓶颈。JetBrains Dottrace就是这样一个例子。这些类型的工具可以帮助进行内存和时间分析

        4
  •  0
  •   Eli    15 年前

    除了使用分析器或其他工具之外,我不确定是否有什么神奇的解决方案。没有一个工具,通常我会先看一下什么明显不可能是瓶颈-你应该知道什么根本不需要时间(数学运算、作业等)和什么可能需要很多时间(循环、图像运算等)。然后你需要做的就是确认你的猜测,得到操作前的时间和操作后的时间,然后减去它们,看看每件事情需要多少毫秒。除了一个或两个代码块外,差异很小。然后你就有了答案。