2009-06-30 3 views
13

Я часто слышу, как люди хвалят скорость компиляции C#. До сих пор я только сделал несколько крошечных приложений, и я действительно заметил, что компиляция была очень быстрой. Тем не менее, мне было интересно, если это все еще сохраняется для больших приложений. Большие проекты C# компилируются быстрее, чем проекты на C++ аналогичного размера?C# время компиляции для больших проектов (по сравнению с C++)

+2

Мне также было интересно то же самое. Я собрал небольшое приложение на C#, и компиляция была удивительно быстрой по сравнению с C++. – Naveen

+0

Я работал над решением, в котором было более 40 проектов (я его не создал), которые занимали много времени (около 1 минуты) для компиляции на PIV. Обновление моего ПК до Core 2 сократило его до гораздо более приемлемого времени, равно как и реорганизация кода на меньшее количество проектов. Наличие большого количества проектов повлияет на время компиляции проектов C#. – RichardOD

ответ

5

Насколько я могу судить по собственному опыту, да, C# компилируется намного быстрее, чем проекты на C++. Даже для больших приложений.

Это можно объяснить тем, что C# менее сложна как язык, чем C++, и что C# переводится в IL (который может быть оптимизирован и переведен позже на машинный код), а C++ сразу переводится на машинный язык ,

10

Да, C# обычно компилируется намного быстрее. Не всегда достаточно быстро. Моя самая большая C# codebase с, возможно, миллионом строк кода с большим количеством проектов занимала около часа, чтобы скомпилировать. Но я подозреваю, что большая часть этого времени связана с плохой системой построения визуальных студий. Время компиляции для C++, с другой стороны, обычно намного дольше, но также значительно зависит от того, как вы организуете свой код. Плохая обработка зависимостей заголовков может легко увеличить время компиляции с несколькими порядками.

+4

+1 для комментариев по плохой обработке файлов заголовков - мы выбросили от 1 часа до 8 минут на нашем большом проекте C++, отсортировав файлы заголовков! –

6

C++ так медленно компилируется, что файлы заголовков должны быть перечитаны и повторно обработаны каждый раз, когда они включены. Из-за того, как работает «#defines», компилятору очень сложно автоматически предварительно скомпилировать все файлы заголовков. (Modula-2 сделал намного лучшую работу). Наличие 100-х заголовков, прочитанных для каждого файла C++, который компилируется, является нормальным для многих проектов на C++.

Иногда инкрементные компиляции C++ могут быть намного быстрее, чем C#. Если у вас есть все ваши файлы заголовков C++ (и дизайн) в очень хорошем состоянии (см. Такие книги, как Large-Scale C++ Software Design, Effective C++). Вы можете внести изменения в реализацию класса, который используется большинством систем, и иметь только одну DLL-перекомпилировать ,

Поскольку C# не имеет отдельных файлов заголовков всякий раз, когда вы меняете имплантацию класса, все виды использования класса перекомпилируются, даже если открытый интерфейс класса не изменился. Это можно уменьшить на C#, используя «программирование на основе интерфейса» и «инъекцию зависимостей» и т. Д. Но это все еще боль.

Однако в целом я нахожу, что C# компилируется достаточно быстро, но большие проекты на C++ настолько сглажены, что я не хочу добавлять методы к «базовому классу» из-за времени перестройки.

Наличие большого количества проектов Visual Studio с несколькими классами в каждом может замедлить работу C#. Объединение связанных проектов вместе, а затем «доверие» к разработчикам не использовать класс, закрытый для пространства имен, иногда может принести большую пользу. (nDepends можно использовать, чтобы проверить людей, нарушающих правила)

(При попытке ускорить компиляцию на C++ я нашел FileMon очень полезным. Один проект, над которым я работал, STL был добавлен в файл заголовка, а сборка получена намного медленнее, просто добавив STL в предварительно скомпилированный файл заголовка, сделав большую разницу! Поэтому отслеживайте время сборки и исследуйте, когда он становится медленнее)

+0

+1 для указания проблемы C# с зависимыми проектами, нуждающимися в перестройке, когда вы только меняете реализацию библиотеки. C++ лучше справляется с четким разделением интерфейса с реализацией, что фактически делает его более подходящим для крупных проектов. Включение зависимостей является лишь обходным путем, поскольку он заставляет всю кодовую базу переписываться соответствующим образом, то есть она инвазивная. –

3

Это также мое наблюдение, что C# значительно быстрее компилируется, чем C++. Одна из основных причин - это, конечно, шаблоны, которые не обязательно должны быть в заголовках на C#, так как нет заголовков. Но интенсивное использование шаблонов (в основном, любой современной библиотеки C++, такой как Boost) убивает время компиляции на C++.

Смежные вопросы