找出方法中的性能瓶颈

时间:2009-08-19 15:21:53

标签: c# linq-to-sql performance

我的代码瓶颈存在一个特定问题,我想解决这个问题,但我想知道将来如何快速找到瓶颈发生的地方而不必重新发明轮子。

这是我方法的代码,但就像我说的,我想知道如何一般地了解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 个答案:

答案 0 :(得分:2)

您最好的选择是下载Red Gate ANTS Performance Profiler

等个性能分析应用程序

它可以帮助您找出真正的问题(性能问题并不总是表面上看起来的那些)。

答案 1 :(得分:0)

Profiler是可以帮助您的工具。

Microsoft在msdn中有一个choice of profiler tools。红门分析器未列出,但也值得使用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除了可能使用分析器或其他工具之外,我不确定是否有一些神奇的解决方案。如果没有工具,通常我会先看看明显不能成为瓶颈的东西 - 你应该知道什么时候没有时间(数学运算,任务等)以及可能需要花费大量时间的事情(循环,图像操作等)。然后,您需要做的就是确认您的猜测是在操作之前获取时间和操作之后的时间,然后减去它们以查看每个事物花费了多少ms。除了一个或两个代码块之外,差异可能非常小。然后你有答案。