Ho notato che il jitter C# produce codice più lento rispetto al compilatore C++, anche se non sono utilizzati costrutti "overhead gestiti" (come gli array con indicizzazione controllata).Miglioramenti del jitter C# nelle versioni future del framework
Per quantificarlo, ho cronometrato il seguente semplice ciclo:
public static int count = 1000000000;
public static int Main()
{
int j = 0;
for (int i = 0; i < count; ++i)
{
j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
}
return j;
}
Questo ciclo prende 3.88s da eseguire (compilato con/o). Il ciclo equivalente compilato con VC 2010 (-O2) richiede 2,95 secondi.
Per verificare che il codice inferiore sia stato effettivamente generato, ho confrontato i codici macchina: creato un elenco (/ FA) dal compilatore VC e collegato un debugger al programma C# (dopo che il ciclo era completato).
Infatti, la versione C++ utilizza alcuni trucchi intelligenti. Ad esempio, per evitare costose moltiplicazioni per 7, esiste un registro separato che viene incrementato di 7 ogni numero di cicli. La versione C# esegue la moltiplicazione (imul) ogni volta. Ci sono anche altre differenze.
Comprendo che il jitter C# ha molto meno tempo per compilare il codice in fase di esecuzione rispetto a VC in fase di compilazione. Ma ad es. Il jitter Java sta ottimizzando dinamicamente i metodi usati frequentemente. C# non sembra farlo.
La mia domanda è: ci sono piani per migliorare il jitter C# nelle versioni future del framework?
Visual Studio RC 2012 con .NET 4.5 è disponibile per il download da ieri. Scaricalo (è gratuito) ed esegui lo stesso test lì. –
Ho smesso di trattenere il respiro per le nuove ottimizzazioni fatte dal jitter molto tempo fa. MS sembra pensare che sia abbastanza buono in quel dipartimento. – harold
@harold Da quando? –