2016-03-26 4 views
0

Ist es schneller, die Entpackung von Tuple zu verarbeiten und einige Variablen zu verwenden, statt nur Tuple zu verwenden, wie es ist.
Betrachten Sie dieses Beispiel:Tupel auspacken oder so wie es ist?

Tuple<int,int> test = new Tuple<int,int>; 

int numberOne = int.Parse(Console.Readline()); 
int numberTwo = int.Parse(Console.Readline()); 

test.Item1 = numberOne; 
test.Item2 = numberTwo; 

for(int i = 0; i < 10; i++) 
{ 
    if(test.Item1 * i > test.Item2 * i) 
    {// do stuff} 
    else 
    {// do stuff} 
} 

VS

Tuple<int,int> test = new Tuple<int,int>; 

int numberOne = int.Parse(Console.Readline()); 
int numberTwo = int.Parse(Console.Readline()); 

test.Item1 = numberOne; 
test.Item2 = numberTwo; 

for(int i = 0; i < 1000; i ++) 
{ 
    int tempItem1 = test.Item1; 
    int tempItem2 = test.Item2; 

    if(tempItem1 * i > tempItem2 * i) 
    {// do stuff} 
    else 
    {// do stuff} 
} 

Ich möchte wissen, auch die Tuple mit 2 Variablen, wenn auspackt ist schneller als die Verwendung von item1 und item2. Bleibt das Ergebnis immer gleich, wenn wir mehr als 2 Variablen verwenden?

Vielen Dank im Voraus

+6

Sich Gedanken über den Unterschied in der Leistung auf dieser Ebene ist völlig sinnlos. Schreiben Sie Code, der am einfachsten zu verstehen ist, wenn Sie darauf zurückkommen/ihn an die nächste Person weitergeben. Wenn Sie Leistungsprobleme haben, nehmen Sie Messungen vor und entscheiden Sie dann, wie Sie optimieren. Neunundneunzig Mal von hundert, wird es nicht an dem Ort sein, den Sie erwarten. Hören Sie auf, sich Sorgen zu machen, was "am schnellsten ist", und konzentrieren Sie sich stattdessen auf die Korrektheit und "Verständlichkeit" Ihres Codes. Du konzentrierst dich auf [Mikrooptimierung] (http://programmers.stackexchange.com/questions/99445/is-micro-optimization-important-when-coding) ... – spender

+0

Aber das ist nicht einmal mein Code, den ich gerade geschrieben habe Ich habe mich gefragt, ob es wirklich wichtig ist – KOPEUE

+0

IMO Tupel sind ein unfreundlicher Datentyp, der keine Bedeutung im Namen der Eigenschaft auffängt, so dass der Code klarer wird, indem eine lokale Variable mit einem guten Namen erstellt wird, die auf a zeigt Tupel-Eigenschaft (zum Beispiel 'var numberOfItems = someTuple.Item1;'). Es ist äußerst unwahrscheinlich, dass die Kosten für die zusätzliche lokale Variable Ihr Programm erheblich verlangsamen, es sei denn, es befindet sich in einem heißen Abschnitt des Codes, der millionenfach aufgerufen wird. Wenn das Programm langsam ausgeführt wird, verwenden Sie die Profilerstellung, um herauszufinden, wo die Kosten liegen. Ich wette, es wird nicht durch die Zuweisung von ein paar lokalen Variablen getragen. – spender

Antwort

0

Beide Versionen laden die Tupel Elemente aus dem Speicher in einen temporären Wert. Der einzige Unterschied besteht darin, ob es sich um einen temporären IL-Ausführungsstapel oder einen tatsächlichen IL-lokalen Stack handelt. Normalerweise sollte dies in Reichweite des JIT liegen.

Wenn dies ein C-Compiler wäre, wäre 100% sicher, dass die Leistung die gleiche ist. Jeder Fall, in dem das nicht so war, wäre ein Fehler.

Der .NET JIT hat einen sehr schlechten Optimierer, so dass Sie immer Pech haben und in ein Optimiererloch treten können.

+0

Schlecht? Was ist schlecht am .Net Jit Comiler/Runtime? –

+0

Das JIT ist kein sehr ausgefeilter Optimierer, wenn man bedenkt, dass 100 Millionen von .NET-App-Servern es ausführen. Die Hotspot JVM ist weitaus anspruchsvoller. – usr

+0

Im Grunde ist Ihr Argument für die Leistung, dass 100 Millionen von App-Servern es ausführen. Aufgrund Ihres JVM-Kommentars muss ich feststellen, dass Sie nur einen genetisch-logischen Irrtum machen und ohne konkrete Beispiele scheint es, als ob Sie falsche Anschuldigungen machen. –