LINUX.ORG.RU

А насколько сильно она отличается от релизной?

yoghurt ★★★★★
()
Ответ на: комментарий от andreyu

Всё так. Просто оно ускоряет компиляцию в целом, а у ТСа, видимо, какая-то значительная разница между сборкой дебага и релиза, которую он хочет уменьшить

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

а у ТСа, видимо, какая-то значительная разница между сборкой дебага и релиза

Да ладно:

Пробовал отключать оптимизацию, ничего не поменялось

andreyu ★★★★★
()

Пробовал отключать оптимизацию, ничего не поменялось.

Может дефайны делают тебе разницу? _DEBUG всякие.

Pavval ★★★★★
()
Ответ на: комментарий от andreyu

само собой что я использую Precompiled headers, forward declarations и многопоточную сборку. также взял мать на два процессора по 8 ядер, временный каталог перенёс на рамдиск, это сократило сборку с пяти минут примерно до 1.5. но ждать полторы минуты после того как сделал мелкую правку тоже напрягает. интеловский компилятор всё равно очень долго думает, гугл чего-то молчит, будто эта проблема больше никого не волнует.

ioan
() автор топика
Ответ на: комментарий от Shadow1251

нет ещё, хотелось бы с интелом, т.к. релиз собирается именно на нём. а с другими могут возникать небольшие несовместимости. если решения не найду то прийдётся пробовать clang и тд.

ioan
() автор топика

Intel C++

Они уже перестали вставлять примерно такие палки:

...
if (cpuId.contains("AMD")) {
    for (double i = 0.0d; i < 1000000.0d; i+=0.1d) { int a = (int) i / i * 2; }
    usleep(10000);
}
...

в колёса, если код выполняется на AMD-процессоре?

EXL ★★★★★
()
Ответ на: комментарий от EXL

по поводу палок я не знаю, код крутится на серверах, которые все на интеловской платформе. когда я тестил последний раз (года три назад) на интеловской платформе, то прирост скорости по сравнению с gcc был приличный, около 25-30%, поэтому решил на него перейти.

ioan
() автор топика
Ответ на: комментарий от Shadow1251

да вот хочу ещё один комп собрать чтоб через distcc компилять сразу на двух. это конечно дороже, чем просто как-то отключить оптимизацию в компиляторе (как это делается в vs, например) - если она там вообще отключается ) поэтому и спросил, может кто знает волшебный ключик компилера )

ioan
() автор топика
Ответ на: комментарий от ioan

будто эта проблема больше никого не волнует.

Не удивлюсь, если так и есть. Интеловский компилятор ведь, если я ничего не путаю, «подстраивается» под «общепринятый системный», в смысле под линуксом использует ГЦЦ ключи, под виндой - майкросовтовские. Так может собирать «для разработки» родным компилятором - может быстрее будет? А релизы уже интеловским.

DarkEld3r ★★★★★
()
Ответ на: комментарий от ioan

это сократило сборку с пяти минут примерно до 1.5. но ждать полторы минуты после того как сделал мелкую правку тоже напрягает.

Мелкая правка, а собирается 1.5 минуты? Хм.

andreyu ★★★★★
()
Ответ на: комментарий от EXL

Они уже перестали вставлять примерно такие палки

А что, такое вообще было? Кто-то доказал что это факт? Невероятная наглость от ынтела...

I-Love-Microsoft ★★★★★
()

Разбивай код на мелкие файлы. Если ты, конечно, не покусан Александреску, тогда не поможет.

anonymous
()
Ответ на: комментарий от ioan

но ждать полторы минуты после того как сделал мелкую правку тоже напрягает

Мелкая правка - это один файл. Если у тебя один файл собирается полторы минуты, меняй компилятор. Если твоя система сборки не умеет пересобирать только то что изменилось и пересобирает всё - меняй систему сборки. Иначе у тебя бардак с include'ами. От precompiled headers, кстати, для скорости сборки лучше избавиться, ибо шаг влево/шаг вправо, и приходится пересобирать всё. Реального же ускорения они не дают никакого. Остаётся только по-человечески разбивать проект на модули, использовать только нужные #include (особенно в других хедерах) и использовать forward declarations во все поля.

slovazap ★★★★★
()
Ответ на: комментарий от ioan

Алсо, есть идиома pImpl которая позволяет почти полностью избавить header'ы от зависимостей. Но это на самом деле сомнительное решение только ради увеличения скорости компиляции.

slovazap ★★★★★
()
Ответ на: комментарий от uuwaan

Сомнительное, потому что даёт runtime оверхед, уродует и усложняет код. Другое дело что у него могут быть полезные применения, но если единственная цель - ускорить компиляцию, то за него нужно убивать.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Сомнительное, потому что даёт runtime оверхед

Расскажи по оверхед подробнее, пожалуйста. Мне ясен только один аспект: скрытая часть класса вынуждена будет располагаться всегда в динамической памяти. Но это никакой не big deal, куча программ оперирует динамически создаваемыми объектами.

uuwaan ★★
()
Ответ на: комментарий от EXL

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

Mahmood
()
Ответ на: комментарий от uuwaan

Очевидно же, ненужный indirection на каждый вызов метода. Что ты имел в виду под динамической памятью я не понял.

slovazap ★★★★★
()
Ответ на: комментарий от uuwaan

Но это никакой не big deal, куча программ оперирует динамически создаваемыми объектами.

А есть другая куча программ, где производительность всё-таки важна. И new vs стек дает охренительную разницу.

Pavval ★★★★★
()
Ответ на: комментарий от Shadow1251

Использовать #ifndef/#define/#endif вместо #pragma once.

вау! и во сколько раз ускорится компиляция? пойду пацанам расскажу

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Если я не ошибаюсь, при использовании

#pragma once
gcc, к примеру, для каждого файла, содержащего эту директиву, проверяет флаг seen_once_only:

/* gcc/lipcpp/files.c */

  if (!pfile->seen_once_only)
    return true;

, тогда как controlling #if-#endif pair не поднимает никаких флагов для проверки, а при соблюдении некоторых условий обработка таких include guard может быть оптимизирована препроцессором.

Насколько это может увеличить скорость сборки - не знаю, но ТС спрашивал обо всех возможных вариантах.

Shadow1251
()
Ответ на: комментарий от Shadow1251

С другой стороны

#pragma once
не будет дергать препроцессор.
В общем, походу это последнее на что стоит смотреть в поисках ускорения.

Shadow1251
()
Ответ на: комментарий от slovazap

Очевидно же, ненужный indirection на каждый вызов метода.

Виртуальные методы тоже запретить? pimpl - это просто более гибкая альтернатива позднему связыванию.

no-such-file ★★★★★
()

попробуй отключить IPO (inter-procedural optimization) эта штука реально тормозит сборку... причем тормозит оно на этапе пост-компиляции (или на линковке, смотря в каком месте воткнуто), смотреть на ключи -ipo, -fast

hoopoe ★★
()
Ответ на: комментарий от EXL

к тебе уже выехали за раскрытие проприетарных исходников

anonymous
()
Ответ на: комментарий от EXL

Они уже перестали вставлять примерно такие палки:
в колёса, если код выполняется на AMD-процессоре?

Судя по данной тобой ниже ссылке на хабру, палки они втсавляют исключительно на этапе компиляции, т.е. код, собранный на Интеле, должен выполняться на АМД с соответствующим набором команд без всяких костылей.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от hoopoe

у меня они отключены. попробовал включить, так компилятор безвременно завис на последнем этапе )

ioan
() автор топика
Ответ на: комментарий от no-such-file

Виртуальные методы тоже запретить?

Зачем? Виртуальные методы применяются там, где нужны. А pimpl даст оверхед вообще на любом вызове. Другое дело, что почти всегда на это пофиг.

DarkEld3r ★★★★★
()
Ответ на: комментарий от slovazap

Cнижение связности по зависимостям никогда не сомнительно :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slovazap

Виртуальные методы оправдывают свой оверхед, pImpl - нет.

Ничего, что pimpl - это виртуальные методы с ручным управлением?

no-such-file ★★★★★
()
Ответ на: комментарий от hoopoe

Два бокала этому мсье :) У нас во время борьбы за скорость сборки на билд-серверах именно /GL /LTGC и аналоги были выпилены.

slackwarrior ★★★★★
()
Ответ на: комментарий от DarkEld3r

А pimpl даст оверхед вообще на любом вызове

На любом вызове через pimpl. Никто тебя не заставляет всё через pimpl вызывать, что-то можно и через статическое связывание.

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

no-such-file ★★★★★
()
Ответ на: комментарий от slovazap

но если единственная цель - ускорить компиляцию, то за него нужно убивать.

Расскажешь заказчикам, почему они не могут получить сборку раньше чем через пол-дня - если тебя раньше не убьют :)

slackwarrior ★★★★★
()
Ответ на: комментарий от no-such-file

Он не для этого нужен, как тут пытаются втирать.

При нормальной разбивке компонентов, которой pimpl таки способствует by design, сокращение времени компиляции является бонусом :) «Оверхедофобия» без обоснований затрат на преждевременную оптимизацию (а они будут, т.к. в некоторых местах при упоротом избегании удобных способов и лени («да фу... дольше писать!») будет черезжопная борьба с перекрестными/циклическими зависимостями (форвард декларейшын спасет не всех, а кто-то закончит шизофренией с приватными заголовками (и писать код будет еще дольше :)) - что опять приведет к затратам времени и денег) - такая же религия без внятных оправданий и карго-культизм.

slackwarrior ★★★★★
()
Ответ на: комментарий от slovazap

От precompiled headers, кстати, для скорости сборки лучше избавиться, ибо шаг влево/шаг вправо, и приходится пересобирать всё.

Если правильно ими пользовать, т.е. включать в них сторонние библиотеки, то ничего пересобирать не придется.

Реального же ускорения они не дают никакого.

4.2

annulen ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.