2009-08-19 13 views
0

Ich habe ein spezifisches Problem mit einem Engpass in meinem Code, den ich gerne ausbügeln würde, aber ich würde generell gerne wissen, für die Zukunft, wie ich schnell wo einen Flaschenhals finden würde tritt auf, ohne das Rad neu erfinden zu müssen.Leistungsengpass in einer Methode finden

Hier Code ist meine Methode, aber wie ich schon sagte, ich würde gerne wissen, wie allgemein, um herauszufinden, wie lange die Linq-Abfrage nimmt oder wie lange die Datentabelle nimmt, etc zu bauen ....

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; 
} 

Antwort

2

Ihre beste Wette ist eine Profilierung Anwendung herunterladen wie Red Gate ANTS Performance Profiler

Es wird Ihnen helfen, das eigentliche Problem (Performance-Probleme sind nicht immer das, was sie auf der Oberfläche scheinen) lokalisieren.

+0

Oder ein kostenloses Tool, das Sie verwenden können, ist http://www.eqatec.com/tools/profiler – Charlie

0

Ein Profiler ist das Werkzeug, das Ihnen helfen könnte.

Microsoft hat eine choice of profiler tools in msdn. Der Red-Gate-Profiler ist nicht aufgeführt, aber es lohnt sich auch zu verwenden.

+0

Red Gate Profiler ist aufgeführt ... ANTS Profiler (es hat sich einige Male geändert, seit diese Seite erstellt wurde). –

0

Sie sollten ein Leistungstool verwenden, um den Engpass zu finden. JetBrains dotTrace ist ein solches Beispiel. Diese Arten von Tools können sowohl bei der Speicher- als auch bei der Timing-Analyse hilfreich sein.

0

Ich bin mir nicht sicher, ob es eine magische Lösung dafür gibt, abgesehen von der Verwendung eines Profilers oder eines anderen Tools. Ohne ein Werkzeug würde ich in der Regel anfangen zu schauen, was eindeutig kein Flaschenhals sein könnte - Sie sollten eine Vorstellung davon haben, was überhaupt keine Zeit braucht (mathematische Operationen, Aufgaben, etc.) und was viel Zeit brauchen kann (Schleifen, Bildoperationen usw.). Dann müssen Sie nur noch die Zeit vor der Operation und die Zeit nach der Operation ermitteln und dann abziehen, um zu sehen, wie viele ms jede Sache dauerte. Wahrscheinlichkeiten sind die Unterschiede sind sehr sehr klein mit Ausnahme von ein oder zwei Code-Blöcke. Dann hast du deine Antwort.

Verwandte Themen