发现性能瓶颈的方法(Find performance bottleneck in a method)

2019-10-29 13:44发布

我有我的代码中的瓶颈,我想,以消除特定的问题,但我想一般都知道,对于未来,我将如何去寻找快速哪里会出现瓶颈,而不必重新发明轮子。

这里是我的方法的代码,但就像我说的,我想知道如何普遍找出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;
}

Answer 1:

最好的办法是下载像分析应用红门蚂蚁性能分析器

它会帮你找出真正的问题(性能问题并不像它表面上看起来是什么)。



Answer 2:

分析器是工具,可以帮助你。

微软拥有的探查工具选择在MSDN中。 红门探查未列出,但它值得过于使用。



Answer 3:

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



Answer 4:

我不知道是否有可能从使用分析器或其他工具的一些神奇的解决这个,一边。 如果没有工具,通常我会通过看什么显然不能成为一个瓶颈开始 - 你应该有什么需要根本没有时间(数学运算,作业等),有些什么想法可能需要大量的时间(环路,图像操作等)。 然后,所有你需要做的,以确认您的猜测是操作和手术后的时间之前得到的时间,然后减去他们看到的每一件事情多少毫秒了。 机会是差异将除了一个或两个码块非常非常小。 然后,你有你的答案。



文章来源: Find performance bottleneck in a method