Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Precompiled headers 
:(
    Опции темы
SaDFromSpb
Дата 25.11.2007, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Еще помогает ключик компилятора, который компиляцию распараллеливает (например, -j для gcc). Ну это совет для счастливых обладателей многоядерных систем (ну или хотя бы Р4 с HT). Вот у меня библиотека собиралась где-то полторы минуты, а когдя я про этот ключик узнал, стала за 10 секунд собираться, ибо в машине два четырехъядерных ксеона.
А еще компиляцию по сети распараллеливать можно....


Это сообщение отредактировал(а) SaDFromSpb - 25.11.2007, 02:32


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
archimed7592
Дата 25.11.2007, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



SaDFromSpb, этот ключик имеет какой-нибудь смысл при компиляции одного модуля? Или только когда все модули скопом компилируешь помогает?
Просто, я точно такой же ключик использую, только относительно make - он одновременно запускает компиляцию сразу нескольких модулей(точнее использовал - сейчас p3-1GHz + 768RAM делать этого не позволяют :( ).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SaDFromSpb
Дата 25.11.2007, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(archimed7592 @  25.11.2007,  02:35 Найти цитируемый пост)
Просто, я точно такой же ключик использую, только относительно make - он одновременно запускает компиляцию сразу нескольких модулей(точнее использовал - сейчас p3-1GHz + 768RAM делать этого не позволяют :( ). 

А!! блин! Спать уже пора мне! Естественно, этот ключ к make'у относится! Распараллеливается по объектникам, на сколько я могу судить. Следовательно, при компиляции одного - смысла не имеет.

ПыСы: Знатный исходничек должен быть, чтобы единственный объектник из него значительное время компилился.



--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
archimed7592
Дата 25.11.2007, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(SaDFromSpb @  25.11.2007,  03:17 Найти цитируемый пост)
Распараллеливается по объектникам, на сколько я могу судить

По make targets, если быть точнее smile.


Цитата(SaDFromSpb @  25.11.2007,  03:17 Найти цитируемый пост)
ПыСы: Знатный исходничек должен быть, чтобы единственный объектник из него значительное время компилился.

Не обязательно. В случае неиспользования PCH необходимо приличное время на парсинг хэдеров. Т.е. вот у меня, даже при размере одного модуля не более 250 строк, он без PCH компилится 15-40 секунд. Вот и посчитай сколько времени у меня идёт пересборка проектика из 50-60 модулей. C PCH 1-2 секунды на модуль. Разница совсем не 30% smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SaDFromSpb
Дата 25.11.2007, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Цитата(archimed7592 @  25.11.2007,  03:31 Найти цитируемый пост)

По make targets, если быть точнее smile.

Ага.  smile 

Цитата(archimed7592 @  25.11.2007,  03:31 Найти цитируемый пост)
Т.е. вот у меня, даже при размере одного модуля не более 250 строк, он без PCH компилится 15-40 секунд.

Хм.. Однако ж..  smile



--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Mayk
Дата 25.11.2007, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(archimed7592 @  25.11.2007,  05:01 Найти цитируемый пост)

Хех. А ты попробуй теперь изменить один файл и опять сделать make ;).

замеряем. [тесты  приложу в аттаче]
Цитата(./test_pch.sh)

precompiled headers only
w.o. pch: 0:02.60
pch: 0:00.24

разница ощутима.

Цитата(bsa @  25.11.2007,  04:57 Найти цитируемый пост)
Правда, обнаружилась проблема с <boost/bind.hpp> (при линковке куча проблем с _1, _2...) 

теперь пробуем с лямбдой и биндом, #include которых вынесен из pch.hh в *.cpp:
[мне было в ломы читать доку о том как заставить компилить .hpp в .gch и йа тупо переименовал файл]
Цитата(./test_pch2.sh)

precompiled headers + #include boost/lambda et al
w.o. pch: 0:03.32
pch: 0:00.75

ыыыы. 

Однако как-то неприятно что boost.bind, помещенный в pch.hpp приводит к ошибкам линковки. 
Вот допустим, изменили мы исходники, компилируем, линкуем, и тут оп-па. ошибки. 
Вот сиди как дурак и думай, это ты накосячил, или pch.

Цитата(archimed7592 @  25.11.2007,  05:28 Найти цитируемый пост)
К сожалению, prelinked headers пока не изобрели

Зато изобрели incremental link smile 


Это сообщение отредактировал(а) Mayk - 25.11.2007, 06:43

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  pch.tar.bz2 7,49 Kb


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Alek86
Дата 25.11.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



а я придерусь к
Цитата(archimed7592 @  24.11.2007,  23:54 Найти цитируемый пост)
2. Может быть только один PCH.

если я сие выражение правильно понял, то оно неверое. PCH должно быть несколько (для больших проектов), причем в самый главный должны быть включены самые статические библиотеки, во второй должен быть включен первый и библиотеки, меняющиеся чуть более часто и т.п.


все это не мои идеи, а нагло спертые с книги "Шаблоны C++ Справочник разработчика" smile

Это сообщение отредактировал(а) Alek86 - 25.11.2007, 08:48


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 25.11.2007, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Alek86, ограничение в один PCH накладывает qmake.

Добавлено через 3 минуты и 17 секунд
Цитата(archimed7592 @ 25.11.2007,  01:28)
Правда, я помню долго ждал линковки только один раз, когда, в отладочных целях, поставил ключик -fkeep-inline-functions smile.

У меня такого ключика нет. Но тормозит так дико именно на сборке проекта для отладки (хотя, релиз там собирать не пробовал).
PM   Вверх
archimed7592
Дата 25.11.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  25.11.2007,  12:23 Найти цитируемый пост)
Alek86, ограничение в один PCH накладывает qmake.

Не только smile.

Цитата(Alek86 @  25.11.2007,  08:48 Найти цитируемый пост)
PCH должно быть несколько (для больших проектов)

Видишь ли... Ты можешь насоздавать с десяток PCH, но если взять произвольный модуль, то в нём должен использоваться только один PCH. Это очень ясно прописано в мануале GCC(и ограничение qmake тут не при чём - более одного PCH не позволяет и MSVC).

Цитата(Mayk @  25.11.2007,  06:41 Найти цитируемый пост)
[мне было в ломы читать доку о том как заставить компилить .hpp в .gch и йа тупо переименовал файл]

Код
g++ -x c++-header [много ключиков компилятора] -o tmp/objs/PCH.hpp.gch/c++ ../src/PCH.hpp



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 25.11.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата

One attractive approach to manage precompiled headers is to create layers of precompiled headers that go from the most widely used and stable headers (for example, our std.hpp header) to headers that aren't expected to change all the time and therefore are still worth precompiling. However, if headers are under heavy development, creating precompiled headers for them can take more time than what is saved by reusing them. A key concept to this approach is that a precompiled header for a more stable layer can be reused to improve the precompilation time of a less stable header.

цитата из "Cpp Templates The Complete Guide" глава 6.5

я неправильно прочел? тут другой смысл?


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 25.11.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  25.11.2007,  14:01 Найти цитируемый пост)
я неправильно прочел? тут другой смысл? 

Смысл тут такой, что делать слои из PCH.
Я же говорил о следующей ситуации: допустим, ты отдельно прекомпильнёшь std.hpp, отдельно Qt.hpp и напишешь в модуле
Код

#include "std.hpp"
#include "Qt.hpp"

Так вот, так делать нельзя - можно только что-то одно. Слоями можно(но смысла особого не вижу - разве что свои рабочие заголовки прекомпилять).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 25.11.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(archimed7592 @  25.11.2007,  14:13 Найти цитируемый пост)
но смысла особого не вижу

я вижу для больших проектов. жаль, если нет возможности


Цитата(archimed7592 @  25.11.2007,  14:13 Найти цитируемый пост)
разве что свои рабочие заголовки прекомпилять

почему нельзя чужие? они ж тоже меняются (но намного реже) - их прекомпилять и надо


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 25.11.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  25.11.2007,  14:17 Найти цитируемый пост)
я вижу для больших проектов

Я не пробовал использовать "слоевую" организацию PCH - если при компиляции рабочих хэдеров действительно получится reuse'ить уже готовый PCH, содержащий std,Qt,Boost и пр. либы, которые, то это просто прекрасно(тогда понимаю, почему bsa сказал, что ограничение на один PCH - это у qmake).

Цитата(Alek86 @  25.11.2007,  14:17 Найти цитируемый пост)
почему нельзя чужие? они ж тоже меняются (но намного реже) - их прекомпилять и надо 

Да... не всегда намного реже smile. Зависит от политики делания commit'ов.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 25.11.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я просто посмотрел, команду компиляции g++ с использованием PCH и без. Отличие только одно - добавляется -include debug/projectname.gch, где debug/projectname.gch - это такой каталог, в котором создается файл "c++", размером под сотню мегабайт. В описании опции -include в мане gcc сказано, что она аналогична инструкции препроцессора #include в тексте программы. Отсюда напрашивается вывод, что можно указывать больше директив компилятора -include для каждого набора заголовков... Но что-то мне подсказывает, что для одного модуля не стоит использовать более одного прекомпилированного заголовка.
PM   Вверх
archimed7592
Дата 25.11.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  25.11.2007,  14:50 Найти цитируемый пост)
Но что-то мне подсказывает, что для одного модуля не стоит использовать более одного прекомпилированного заголовка. 

http://gcc.gnu.org/onlinedocs/gcc/Precompi...ompiled-Headers
Цитата
Only one precompiled header can be used in a particular compilation.

Там же ещё несколько правил, относительно корректного использования pch.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1294 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.