Modificare:
Aggiunto un esempio che può essere fatto con l'istruzione if-else ma non con l'operatore condizionale.
Prima della risposta, dai un'occhiata a [ Qual è più veloce? ] sul blog del signor Lippert. E penso che la risposta del signor Ersönmez sia la più corretta qui.
Sto cercando di menzionare qualcosa che dovremmo tenere a mente con un linguaggio di programmazione di alto livello.
Prima di tutto, non ho mai sentito dire che l'operatore condizionale dovrebbe essere più veloce o ugualmente performante con l'istruzione if-else in C♯ .
Il motivo è semplice che cosa succede se non ci sono operazioni con l'istruzione if-else:
if (i > 0)
{
value += 2;
}
else
{
}
Il requisito dell'operatore condizionale è che ci deve essere un valore per entrambi i lati e in C♯ richiede anche che entrambi i lati :
abbiano lo stesso tipo. Questo lo rende diverso dall'istruzione if-else. Quindi la tua domanda diventa una domanda che chiede come viene generata l'istruzione del codice macchina in modo che la differenza di prestazioni.
Con l'operatore condizionale, semanticamente è:
Qualunque sia l'espressione valutata, c'è un valore.
Ma con l'istruzione if-else:
Se l'espressione viene valutata come vera, fai qualcosa; in caso contrario, fai un'altra cosa.
Un valore non è necessariamente coinvolto nell'istruzione if-else. Il tuo presupposto è possibile solo con l'ottimizzazione.
Un altro esempio per dimostrare la differenza tra loro sarebbe il seguente:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
if(i>0)
array1[1]=4;
else
array2[2]=4;
il codice sopra compilato, tuttavia, sostituisce l'istruzione if-else con l'operatore condizionale semplicemente non compilerà:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
(i>0?array1[1]:array2[2])=4; // incorrect usage
L'operatore condizionale e le istruzioni if-else sono concettualmente uguali quando si fa la stessa cosa, probabilmente anche più velocemente con l'operatore condizionale in C , poiché C è più vicino all'assemblaggio della piattaforma.
Per il codice originale che hai fornito, l'operatore condizionale è usato in un ciclo foreach, che rovinerebbe le cose per vedere la differenza tra loro. Quindi sto proponendo il seguente codice:
public static class TestClass {
public static void TestConditionalOperator(int i) {
long value=0;
value+=i>0?2:3;
}
public static void TestIfElse(int i) {
long value=0;
if(i>0) {
value+=2;
}
else {
value+=3;
}
}
public static void TestMethod() {
TestConditionalOperator(0);
TestIfElse(0);
}
}
e le seguenti sono due versioni di IL ottimizzate e non. Poiché sono lunghi, sto usando un'immagine per mostrare, il lato destro è quello ottimizzato:
(Clicca per vedere l'immagine intera.)
In entrambe le versioni del codice, l'IL dell'operatore condizionale sembra più breve dell'istruzione if-else e sussiste ancora un dubbio sul codice macchina finalmente generato. Di seguito sono riportate le istruzioni di entrambi i metodi e la prima immagine non è ottimizzata, la seconda è quella ottimizzata:
In quest'ultimo caso, il blocco giallo è il codice eseguito solo se i<=0
e il blocco blu indica quando i>0
. In entrambe le versioni delle istruzioni, l'istruzione if-else è più breve.
Si noti che, per istruzioni diverse, il [ CPI ] non è necessariamente lo stesso. Logicamente, per l'istruzione identica, più istruzioni costano un ciclo più lungo. Ma se si prendono in considerazione anche il tempo di recupero delle istruzioni e la pipe / cache, il tempo totale reale dell'esecuzione dipende dal processore. Il processore può anche prevedere i rami.
I processori moderni hanno ancora più core, le cose possono essere più complesse con questo. Se tu fossi un utente di processori Intel, potresti voler dare un'occhiata a [ Manuale di riferimento per l'ottimizzazione delle architetture Intel® 64 e IA-32 ].
Non so se esistesse un CLR implementato dall'hardware, ma se sì, probabilmente si ottiene più velocemente con l'operatore condizionale perché l'IL è ovviamente inferiore.
Nota: tutti i codici macchina sono di x86.
DateTime
per misurare le prestazioni. UsaStopwatch
. Successivamente, il tempo è piuttosto lungo - è un tempo molto breve per misurare.