Frage

Quandry ist - welche der folgenden zwei Methoden ist das Beste aus
Ziel - Holen Sie sich ein Objekt vom Typ Wrapper (unten definiert)
Kriterien - Geschwindigkeit über den Speicher
nein. von Records - ca. 1000- ca. 2000, max ungefähr 6k
Auswahl - Erstellen Sie Objekt im laufenden Fliegen oder suchen Sie aus einem Wörterbuch nach
Ausführungsgeschwindigkeit - X -mal pro Sekunde genannt

NB - Ich muss zuerst den Arbeitscode liefern und dann zur Optimierung entscheiden. Wenn Theoretiker hinter den Szeneninformationen einen Einblick in den Szeneninformationen geben können

Definitionen -

class Wrapper  
{  
   public readonly DataRow Row;  
   public Wrapper(DataRow dr)  
   {  
      Row = dr;  
   }  
   public string ID { get { return Row["id"].ToString(); } }  
   public string ID2 { get { return Row["id2"].ToString(); } }  
   public string ID3 { get { return Row["id3"].ToString(); } }  
   public double Dbl1 { get { return (double)Row["dbl1"]; } }  
   // ... total about 12 such fields !  
}  
Dictionary<string,Wrapper> dictWrappers;  

Methode 1

Wrapper o = new Wrapper(dr);  
/// some action with o
myMethod( o );

Methode 2

Wrapper o;    
if ( ! dictWrappers.TryGetValue( dr["id"].ToString(), out o ) )    
{    
    o = new Wrapper(dr);    
    dictWrapper.Add(o.ID, o);    
}    

/// some action with o    
myMethod( o );    
War es hilfreich?

Lösung

Der erste wäre schneller, da es nicht tatsächlich nachgefragt wird, sondern nur eine einfache Zuweisung und eine Aufgabe.

Die beiden Codesegmente sind nicht annähernd gleichwertig. In der Funktion könnte jedoch Methode 1 viele Duplikate erzeugen.

Andere Tipps

  1. Nie optimieren, ohne zuerst Profilerstellung zu profilieren.
  2. Profilieren Sie niemals, es sei denn, der Code erfüllt keine Spezifikationen/Erwartungen.
  3. Wenn Sie diesen Code profilieren müssen, schreiben Sie ihn in beide Richtungen und beachten Sie ihn mit Ihrer erwarteten Last.

Bearbeiten: Ich versuche, die folgende Optimierung zu bevorzugen, es sei denn, die Leistung ist inakzeptabel:

  • Einfachheit
  • Lesbarkeit
  • Wartbarkeit
  • Testbarkeit

Ich habe (kürzlich) einen hochoptimierten Code gesehen, der sehr schwer zu debuggen war. Ich habe es neu gestaltet, um es zu vereinfachen, und führte dann Leistungstests durch. Die Leistung war inakzeptabel, also profilierte ich sie, fand die Engpässe und optimierten nur diese. Ich habe die Leistungstests neu und der neue Code war vergleichbar mit der hochoptimierten Version. Und es ist jetzt viel einfacher zu pflegen.

Hier ist ein kostenloser Profiling -Werkzeug.

Ohne tatsächlich zu testen, würde ich erwarten, dass das Zwischenspeichern der Feldwerte in Wrapper (dh die Vermeidung aller Tostring -Anrufe und -absaugs) wahrscheinlich mehr Einfluss auf die Leistung haben würde.

Sobald Sie diese Werte zwischenstrichen, möchten Sie wahrscheinlich Fälle von Wrapper beibehalten, anstatt sie häufig neu zu erstellen.

Angenommen, Sie sind Ja wirklich besorgt über pro (hey, es passiert), dann könnte Ihr zugrunde liegender Wrapper selbst verbessert werden. Sie machen Feldsuche mit String. Wenn Sie den Anruf mit demselben Feld in der Zeile viel tätigen, ist es tatsächlich schneller, die Ordnungen zwischenzuspeichern und nach Ordinal nachzuschauen.

Dies ist natürlich nur, wenn Sie sich wirklich, wirklich um die Leistung kümmern müssen, und die Fälle, in denen dies einen Unterschied machen würde, sind ziemlich selten (obwohl es auf eingebetteten Geräten nicht so selten ist wie auf dem Desktop).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top