Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2014, 22:12   #1
execoma
 
Регистрация: 10.04.2010
Сообщений: 3
По умолчанию Ускорение компиляции

Здравствуйте, Коллеги!

Исходные данные:
Очень большой проект, сотни модулей. Среда C++ Builder XE Starter. Подключено очень много дополнительных компонентов (DevExpress, TMS, DevArt, TRichView и другие). Процессор Intel Core i5 2500К.

Проблема:
Компиляция занимает до 8 минут !!! Из-за этого не только невозможно войти в состояние потока, а в принципе работать просто невозможно!!! Полагаю, что компилятор ведет себя некорректно каждый раз делая полную перекомпиляцию после того, как вносится изменение в любой header файл или добавляется/удаляется компонент на форме. Ведь другие модули не трогаются, а он перекомпилит весь проект. Если вносить правки в CPP-файлы, то перекомпилится только измененые модули. Возможно есть какая-та настройка в настройках компилятора, но я не знаю какая, чтобы он реже делал полную перекомпиляцию.

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

1. Предкомпилированные заголовки используются для vcl.h, а для сторонних компонентов их не удается использовать, т.к. ими автоматом прописываются либы в header файлах, в которых простановка #pragma hdrstop не работает (если я правильно понял, то предкомпилированные заголовки не могут прописываться в h-файлах). Если предкомпилированные заголовки и дают какую-то выгоду для vcl.h, то очень незначительную.

2. Компиляция у IDE идет только на одном ядре, поэтому существует средство распаралеливания компиляции модулей IDECompilerSpeedFix, оно уже давно устарело, не развивается и не работает под XE.

3. Разбиение программы на отдельные модули достаточно проблемная задача.

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

Также интересно в XE2-XE7 эта проблема решена или нет.
execoma вне форума Ответить с цитированием
Старый 23.11.2014, 22:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Разбил бы проект на библиотеки такого бы не было.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2014, 23:10   #3
execoma
 
Регистрация: 10.04.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Разбил бы проект на библиотеки такого бы не было.
Я пока не знаю как это лучше было бы сделать. Да и в любом случае это будет очень тяжело, т.к. там много что с чем связанно. Поэтому идеальным было бы самому принимать решение, когда делать полную перекомпиляцию, а когда нет. В худшем случае могут возникнуть ошибки линковки, например, когда был удален элемент на который ссылались другие модули. Более этого особых проблем не вижу. Поэтому мне кажется, что такая возможность должна быть.
execoma вне форума Ответить с цитированием
Старый 24.11.2014, 18:31   #4
execoma
 
Регистрация: 10.04.2010
Сообщений: 3
По умолчанию

Ситуацию удалось серьезно улучшить путем изменения архитектуры проекта.

До:
Проект имеет файл Global.h, в который подключены абсолютно все модули проекта. Это позволило в свое время избежать серьезной каши в виде #include-ов в каждом файле проекта. А также это дало единое пространство, где можно было обращаться к чему угодно откуда угодно. С ростом проекта это дало негативные последствия.

После:
Поскольку проект имеет некоторые концептуальные модули (включающие по несколько форм), то были созданы GlobalModuleName.h файлы, включающие эти формы, а подключения из Global.h были убраны. Это позволило как бы разбить общее пространство на части.

В результате при правках в h файлах форм происходит перекомпиляция, только этой формы, GlobalModuleName.h и форм, в которых подключен GlobalModuleName.h (т.е. главных форм).

Сейчас заголовок в cpp-шниках форм выглядят следующим образом:

#include <vcl.h>
#pragma hdrstop
#include "Global.h"
#include "FormX.h"

И вот так в формах, где нужно использовать эту форму FormX:

#include <vcl.h>
#pragma hdrstop
#include "Global.h"
#include "GlobalModuleName.h"

А в GlobalModuleName.h уже прописана сама форма:
#include "FormX.h"
и куча других форм.

Как же я до этого раньше не допер Но тем не менее я счастлив
execoma вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорение программы С++ rUs_LAN Помощь студентам 4 16.08.2012 13:57
Ускорение функций nXs Общие вопросы Delphi 8 28.02.2012 18:52
Ускорение компиляции jetyb Помощь студентам 4 13.09.2011 23:38
ускорение виндовс voland123454321 Windows 22 04.09.2010 12:16
Ускорение д2010 Utkin Софт 2 29.03.2010 16:03