Время сборки С# для больших проектов (по сравнению с С++)

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

Ответы

Ответ 1

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

Ответ 2

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

Иногда инкрементные компиляции С++ могут быть намного быстрее, чем С#. Если у вас есть все файлы заголовков С++ (и дизайн) в очень хорошем состоянии (см. Книги Масштабный дизайн программного обеспечения на С++, Эффективный С++). Вы можете внести изменения в реализацию класса, который используется большинством системы, и только перекомпилировать одну dll.

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

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

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

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

Ответ 3

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

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

Ответ 4

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