Найти узкое место производительности в методе - PullRequest
0 голосов
/ 19 августа 2009

У меня есть конкретная проблема с узким местом в моем коде, которую я хотел бы сгладить, но я хотел бы знать в целом, как в будущем я мог бы быстро найти место, где возникает узкое место, без необходимости повторно изобрести колесо.

Вот код моего метода, но, как я уже сказал, я хотел бы узнать, как обычно узнать, сколько времени занимает запрос 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 ]

2 голосов
/ 19 августа 2009

Лучше всего загрузить приложение для профилирования, например Red Gate ANTS Performance Profiler

Это поможет вам точно определить реальную проблему (проблемы с производительностью не всегда являются такими, какими они кажутся на поверхности).

0 голосов
/ 19 августа 2009

Я не уверен, есть ли какое-то волшебное решение для этого, кроме, возможно, использования профилировщика или другого инструмента. Без инструмента, как правило, я бы начал с рассмотрения того, что явно не может быть узким местом - вы должны иметь представление о том, что вообще не требует времени (математические операции, задания и т. Д.), А что может занять много времени ( циклы, операции с изображениями и т. д.). Тогда все, что вам нужно сделать, чтобы подтвердить свое предположение, это получить время до операции и время после операции, а затем вычесть их, чтобы узнать, сколько мс потребовалось каждой вещи. Скорее всего, различия будут очень очень маленькими, за исключением одного или двух блоков кода. Тогда у вас есть ответ.

0 голосов
/ 19 августа 2009

Вы должны использовать инструмент производительности, чтобы помочь найти узкое место. JetBrains dotTrace является одним из таких примеров. Эти типы инструментов могут помочь с анализом памяти и синхронизации

0 голосов
/ 19 августа 2009

Профилировщик - это инструмент, который может вам помочь.

У Microsoft есть выбор инструментов профилирования в msdn. Профилировщик красных ворот не указан, но его тоже стоит использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...