Сколько времени занимает компиляция сложного кода?

Сколько времени занимает компиляция сложного кода?

TheXKCDВ комиксе ниже предполагается, что компиляция кода занимает значительное время (возможно, недостаточное для постановки боя на мечах, но вы поняли идею). Однако с простыми кодами Java, над которыми я работал, компиляция 1000 строк или около того в BlueJ занимает менее 2 секунд, а другие IDE, такие как Eclipse, в некоторой степени компилируют на лету.

Так при каких обстоятельствах (язык, сложность кода и т. д.) компиляция фрагмента кода действительно займет много времени (скажем, >1 минуты) или этот комикс просто дает волю творчеству (что, похоже, не похоже на xkcd)?

введите описание изображения здесь

решение1

На это влияет множество факторов, но размер играет важную роль. Большинство современных систем сборки пытаются выполнить частичную компиляцию при изменении кода, чтобы были построены только измененные части. Однако некоторые инструменты не способны на это.

При компиляции миллионов строк кода .NET, распределенных по сотням проектов, время компиляции начинает становиться довольно большим. При компиляции больших библиотек с компиляцией собственного исходного кода, как это часто делается в мире нативного C/C++, вы также увеличите время компиляции.

Особенно в случае с C и C++, время, потраченное на разбор заголовков, весьма существенно. Это очень тяжелый процесс ввода-вывода, связанный с повторным чтением тысяч заголовков снова и снова. Это одна из причин, по которой была создана техника предварительно скомпилированных заголовков. Конечно, SSD также значительно ускоряет это.

Редактировать: Я забыл упомянуть, что сборки часто включают специализированные генераторы кода или компиляторы DSL. Эти инструменты часто являются индивидуальными внутренними проектами, которые не так оптимизированы, как широко используемые инструменты, поэтому они могут стать узким местом при интенсивном использовании.

решение2

С сегодняшними технологиями потребовалась бы довольно большая кодовая база, чтобы компилировать ее хотя бы за минуту. Но когда динозавры (мэйнфреймы и большие мини-компьютеры - на ум приходит PDP 11/70, 64K основной памяти) бродили по земле (середина 70-х), даже терминал, подключенный к единственному компьютеру для команды разработчиков программного обеспечения, был больше, чем современные настольные ПК. Если у вас было соединение со скоростью 9600 бод, вы были одним из избранных - большинство из нас были благодарны за обновление до 2400! Машина была разделена между подключенными пользователями, разделяя задания по времени в режиме циклического перебора.

Когда приближался дедлайн и все пытались скомпилировать свою часть целевой системы, даже время ответа терминальной связи страдало. В тяжелых случаях процессор тратил столько же времени на перекачку заданий с диска, сколько и на их фактическую обработку. В таких ситуациях время компиляции порядка многих минут было не редкостью.

Я помню похожий (хуже!) разговор из этого мультфильма, около 3:30 утра, когда приближался дедлайн. Отдел работал в 3 смены (разница в сменном графике? К черту!), потому что проект был настолько плох, что единственная машина для 25 SWE была настолько завалена. Меня вызвали за то, что я читал книгу в мягкой обложке за своим терминалом, пытаясь не заснуть, ожидая завершения компиляции.

Связанный контент