2011-01-09 12 views
1

Was, wenn überhaupt, wäre der Leistungsunterschied zwischen diesen?C# - Array-Index vs LINQ?

/// option 1 
string result = data.Split('.').Last<string>(); 


/// option 2 
string[] parts = data.Split('.'); 
string result = data[data.Length-1]; 

/// option 3 
string result = data.Substring(data.LastIndexOf('.')+1); 

sei angenommen, daß eine Zeichenkette data im Format von part1.part2.part3 ist.

bearbeiten

Das ist wirklich mehr Neugier als alles andere. Ich habe den offenen Reflektor nicht geknackt, um zu sehen, was in LINQ passiert, aber ich sehe nicht, wie es schneller sein könnte als direkte Array-Manipulation. Danke für die Tipps.

+0

Sie vermissen etwas (dat.Substring?) In Option 3) –

+0

Whoops! Korrigiert. –

Antwort

2
void Main() 
{ 
    var tester = new testing(); 
    var runTimeOne = tester.optionOne(); 
    runTimeOne.Dump(); 
    var runTimeTwo = tester.optionTwo(); 
    runTimeTwo.Dump(); 
    var runTimeThree = tester.optionThree(); 
    runTimeThree.Dump(); 
} 
public class testing 
{ 
    public String dataString = "part1.part2.part3"; 
    public int numRuns = 1000000; 

    public TimeSpan optionOne() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string result = dataString.Split('.').Last<string>(); 
     } 
     return (DateTime.Now - startTime); 
    } 

    public TimeSpan optionTwo() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string[] parts = dataString.Split('.'); 
      string result = parts[parts.Length-1]; 

     } 
     return (DateTime.Now - startTime); 
    } 
    public TimeSpan optionThree() 
    { 
     var startTime = DateTime.Now; 

     for(var i = 0; i < numRuns; i++) 
     { 
      string result = dataString.Substring(dataString.LastIndexOf('.')+1); 
     } 
     return (DateTime.Now - startTime); 
    } 
} 

Ergebnis:

00: 00: 00.9660552

00: 00: 00.2010115

00: 00: 00,0360021

+0

Danke für das Benchmarking. =) –

+0

Hätte nicht erwartet, dass der Unterschied zwischen 1 und 2 so groß ist. Beachten Sie, dass bei langen Strings der Unterschied zwischen 1 und 2 ungefähr gleich bleibt, aber der Unterschied zwischen 2 und 3 zunimmt. – CodesInChaos

4

Wenn Sie wirklich interessiert, messen Sie es.

Ich würde Option 3 schätzen, etwas schneller zu sein als die anderen 2.
Aber das ist nur eine Vermutung.

2

Die Optionen 1 und 2 sind in Bezug auf die Leistung identisch, da die Methode Last extension prüft, ob der zugrunde liegende Wert einen Indexer hat. Ist dies der Fall, wird einfach das letzte Element zurückgegeben. Was Option 3 betrifft, müssen Sie es mit den anderen beiden messen, aber ich vermute, dass es einen vernachlässigbaren Unterschied geben wird.

+0

Ihre Argumentation unterstützt Ihre Schlussfolgerung nicht. Wenn Option 1 etwas Arbeit leistet (nach dem Vorhandensein eines Indexers sucht) und danach Option 2, dann ist Option 1 wahrscheinlich langsamer als Option 2. –

1

Für kleine Strings die Differenz klein sein würde, aber Bei großen Saiten ist die dritte Option deutlich effizienter.

Die ersten beiden Optionen scannen den gesamten String und kopieren ihn in neue Strings und erstellen ein Array der Strings. Die dritte Option scannt nur die Zeichenfolge vom Ende, um nach dem Punkt zu suchen, und erstellt nur die eine Zeichenfolge, die benötigt wird.

Also, für eine bestimmte Verwendung würden Sie messen, welche Methode für die spezifischen Daten am effizientesten ist, aber für den allgemeinen Gebrauch ist die dritte Option die beste, weil sie viel besser skaliert.

Verwandte Themen