2009-06-30 33 views
13

Spesso sento persone elogiare la velocità di compilazione di C#. Finora ho realizzato solo alcune applicazioni minuscole, e in effetti ho notato che la compilazione era molto veloce. Tuttavia, mi chiedevo se questo vale ancora per grandi applicazioni. I grandi progetti C# vengono compilati più rapidamente dei progetti C++ di dimensioni simili?Tempo di compilazione C# per progetti di grandi dimensioni (rispetto a C++)

+2

Mi stavo anche chiedendo lo stesso. Ho compilato una piccola applicazione in C# e la compilazione è stata incredibilmente veloce rispetto a C++. – Naveen

+0

Ho lavorato su una soluzione che conteneva oltre 40 progetti (non l'ho creata) che impiegava molto tempo (circa 1 minuto) per la compilazione su un PIV. L'aggiornamento del mio PC a un Core 2 l'ha ridotto a un tempo molto più accettabile, così come il refactoring del codice in un numero inferiore di progetti. Avere molti progetti inciderà sul tempo di compilazione dei progetti C#. – RichardOD

risposta

5

Per quanto ne so dalla mia esperienza, sì, C# si compila molto più velocemente dei progetti C++. Anche per applicazioni di grandi dimensioni.

Questo può essere spiegato dal fatto che C# è meno complicato di un linguaggio rispetto al C++ e che C# è tradotto in IL (che può essere ottimizzato e tradotto in seguito in codice macchina) e C++ viene tradotto immediatamente in linguaggio macchina .

10

Sì, C# si compila molto più velocemente. Tuttavia non sempre abbastanza veloce. Il mio più grande numero di codice C# con forse un milione di righe di codice con molti progetti ha richiesto circa un'ora per essere compilato. Ma sospetto che gran parte di questo tempo sia dovuto allo scarso sistema di costruzione degli studi visivi. Il tempo di compilazione per C++ di solito è in genere molto più lungo, ma dipende anche molto da come si organizza il codice. Una scarsa gestione delle dipendenze dei file di intestazione può facilmente aumentare il tempo di compilazione con diversi ordini di grandezza.

+4

+1 per il commento sulla gestione dei file di intestazione - siamo passati da 1 ora a 8 minuti sul nostro grande progetto C++ ordinando i file header! –

6

C++ è così lento da compilare in quanto i file di intestazione devono essere riletti e ripetuti ogni volta che vengono inclusi. A causa del modo in cui "#defines" funziona, è molto difficile per un compilatore precompilare automaticamente tutti i file di intestazione. (Modula-2 ha fatto un lavoro molto migliore di questo) Avere 100s di intestazioni leggere per ogni file C++ che è compilato è normale su molti progetti C++.

A volte le compulazioni C++ incrementali possono essere molto più veloci di C#. Se hai tutti i tuoi file di intestazione C++ (e design) in uno stato molto buono (vedi libri come Large-Scale C++ Software Design, Effective C++) Puoi apportare una modifica all'implementazione di una classe che viene utilizzata dalla maggior parte del sistema e avere una sola dll ricompilare .

Poiché C# non ha file di intestazione separati ogni volta che si modifica l'impianto di una classe, tutti gli usi della classe vengono ricompilati anche se l'interfaccia pubblica della classe non è stata modificata. Questo può essere ridotto in C# usando "programmazione basata su interfaccia" e "iniezione dipendenza" ecc. Ma è ancora un dolore.

Tuttavia, nel complesso, trovo che C# compili abbastanza velocemente, ma i progetti C++ di grandi dimensioni sono così lenti da compilare che non trovo il voler aggiungere metodi a una "classe base" a causa del tempo di ricostruzione.

Avere un sacco di progetti di Visual Studio con una manciata di classi in ciascuno può rallentare molto C#. Combinare insieme i progetti correlati e poi "fidarsi" degli sviluppatori di non usare classi private in uno spazio dei nomi può a volte avere un grande vantaggio. (nDepends può essere usato per verificare se qualcuno infrange le regole)

(Quando si cerca di accelerare le compilazioni C++, ho trovato FileMon molto utile: un progetto su cui ho lavorato, l'STL è stato aggiunto a un file di intestazione e il build ottenuto molto più lento, solo aggiungere STL al file di intestazione precompilato ha fatto una grande differenza! Quindi traccia il tempo di costruzione e indagare quando diventa più lento)

+0

+1 per indicare il problema C# con progetti dipendenti che richiedono una ricostruzione quando si modifica solo l'implementazione di una libreria. C++ fa un lavoro migliore separando chiaramente l'interfaccia dall'implementazione, rendendola più adatta a progetti di grandi dimensioni. L'iniezione delle dipendenze è solo una soluzione, poiché costringe l'intera base di codice a essere riscritta in modo conforme, cioè è invasiva. –

3

È anche mia osservazione che C# è molto più veloce da compilare di C++. Uno dei motivi principali è naturalmente i template che non hanno bisogno di essere nelle intestazioni in C#, poiché non ci sono intestazioni. Ma l'uso massiccio di template (per lo più qualsiasi libreria C++ moderna come Boost) sta uccidendo il tempo di compilazione in C++.

Problemi correlati