2009-03-01 21 views
10

Zauważyłem na tym samym komputerze, zajmuje C# znacznie mniej czasu niż C++ do kompilacji. Czemu?Dlaczego C# kompiluje się znacznie szybciej niż C++?

UWAGA1: Nie wykonałem żadnego naukowego testu porównawczego.

UWAGA2: Zanim ktokolwiek powie, że to nie jest związane z programowaniem, implementuję parser, znajduję to, co mogę zrobić od razu, aby zwiększyć szybkość kompilacji.

UWAGA3: Mam podobne pytanie Why do compilations take so long?. Pytanie to dotyczy konkretnej różnicy od C/C++ do C#. To oczywiste, że prostszy język byłby szybszy do skompilowania niż skomplikowany język, ale C i C# to oba złożone języki.

moje dania na wynos: 1) C/C++ jest WOLNY od preprocesora i nagłówków. 2) wiele nagłówków powoduje parsowanie większej ilości danych. zwłaszcza, gdy każdy plik można używać preprocesora można zmienić kod 3) C# odłożyć jakąś kompilację do Uruchomienie 4) instrukcje IL są proste, maszyna nie jest

+0

Muszę się zastanowić, czy przeczytałeś odpowiedzi na poprzednie pytanie na ten temat: http://stackoverflow.com/questions/588884/why-do-compilations-take-so-long –

+0

tak, mam. To pytanie skupia się na specyficznej różnicy od c do C# –

+0

, które są wywoływane konkretnie w tej odpowiedzi ... to rzeczy, które robi C++, to robi różnicę, nic specjalnego, że C# robi – ShuggyCoUk

Odpowiedz

2

Ponieważ C++ kompiluje się kod maszynowy, a C# - kod bajtowy. Czy zauważyłeś opóźnienie przy pierwszym uruchomieniu programu .NET. To jest, gdy kod bajtowy dostaje JITed (skompilowany do kodu maszynowego).

+0

Na to pytanie jest jednak o wiele więcej. –

+1

Delphi kompiluje się również do kodu maszynowego i jest szybsze niż C#, a nie. – Arafangion

+1

głównym problemem jest źródło, a nie cel. – peterchen

0

Myślę, że jest to prawdopodobnie spowodowane AMOUNT parsowania, które musi wykonać, a nie prędkością samego analizatora składni.

C++ zwykle używa preprocesora C, który pobiera wiele plików włączających (jak sugerowali inni, a drugie pytanie zawiera wiele podobnych odpowiedzi). Spowoduje to zwiększenie ilości kodu do przeanalizowania.

Więc jeśli porównać je do celów napisanie parsera ... dowiedzieć się, że nie powinien mieć .h stylu zawierać pliki :)

5

Istnieją dwie odrębne kwestie do rozważenia - liczba faz przetwarzania i złożoności kierowania.

Typowa kompilacja C++ obejmuje kilka etapów (chociaż mogą one być uruchamiane równolegle), w których Preprocesor obsługuje dyrektywy i makra, wówczas sam kompilator C++ sam przetwarza wynikowy kod. Jest dość powszechne, że preprocesor generuje znacznie większy wynik, kod, który musi zostać przeanalizowany i przetworzony przez rzeczywisty kompilator.

Należy również pamiętać, że kompilator C++ będzie kierował na język maszynowy x86 lub x64 - obsługując całą optymalizację z góry i starając się jak najlepiej wykorzystać sprzęt, który nie jest zoptymalizowany pod kątem rozwoju stylu OO.

W przeciwieństwie do tego kompilator C# jest przeznaczony dla Microsoft Intermediate Language (MSIL), platformy podobnej do maszyny podobnej do poziomu wyższego poziomu, która została zaprojektowana do wykorzystania w rozwoju OO. Wiele konstrukcji dostarczonych przez C# mapuje bezpośrednio do instrukcji IL, czyniąc kompilację naprawdę łatwą. Rzetelna metoda optymalizacji i inne działania są odkładane do momentu uruchomienia rzeczywistego programu, w którym to momencie jest zoptymalizowany pod kątem dokładnie dostępnej maszyny.

Powiązane problemy