Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Арктус от Июнь 26, 2009, 14:58



Название: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 14:58
Здравствуйте.
В QT я новичек, поэтому хотелось бы узнать кое-что.

Вообщем, пишу небольшую утилитку-редактор.
И начиная с определенного момента, столкнулся с сильно возросшим времени компиляции проекта. Если в начале дебажная версия собиралась за 20-30 секунд, а релиз за 2 минуты, то сейчас дебаг занимает 5-7 минут, а компиляции релиза я так ни разу и не дождался.

Весь интерефейс состоит из одной формы, на который лежит QTabWidget. На каждом табе (а их сейчас 6) также расположен аналогичный QTabWidget, содержащий порядка 200 объектов (QLabel, QComboBox, QLineEditEdit).

Причина долгой компиляции строка ui->setupUi(this); Как я понимаю, это как раз и есть создание всего интерфейса.

Я выбрал Qt именно для того, чтобы набросать на форму нужные мне объекты, и забыть о интерфейсе, а тут такая подлянка.
Хотелось бы узнать, можно как-либо обуздать время компиляции, не пребегая к динамическому созданию интерфейса?
Или, есть ли возможность не пересобирать *.ui файл каждый раз, если изменений в нем не было? А то стоит поправить немного код, и здравствуй 7 минутный отдых.

Пользуюсь Qt SDK 4.5 (тот который by Nokia 2009.03)


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: spectre71 от Июнь 26, 2009, 15:03
Походу это проблемы твоего компилятора или среды.
У меня проект из ~200 модулей из них штук 20-30 ui форм, под VS 2005 полностью пересобирается за 5 минут


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 15:08
Не, я конечно знал, что MinGW медленный, но не настолько же.

Я все время пишу то под Borland, то под VS, и там с этим проблем не наблюдалось.

Т.е. придеться импортировать под студию чтоль?


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: spectre71 от Июнь 26, 2009, 15:09
Не думаю что проблема в MinGW


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Июнь 26, 2009, 15:29
Цитировать
Или, есть ли возможность не пересобирать *.ui файл каждый раз, если изменений в нем не было?
А то стоит поправить немного код, и здравствуй 7 минутный отдых.
Если ничего не менял, то и перекомпиляции не должно быть. На основе .ui файла генерится хедер, а он никак не связан с тем, что ты поменял где-то код (если только не в нем самом).
---
Не связано с setup(ui), но может пригодится: http://wiki.qtcentre.org/index.php?title=Reducing_compilation_times

Еще можно почитать темы про redunant include guards, precompiled headers, forward declaration/forward reference. Также можно разбить приложение на библиотеки, чтобы не приходилось перекомпилировать весь код, уже скомпиленное просто линкуется.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 16:13
Сейчас вот запроверил, собрал две дебажные версии:

7 табов (~1700 объектов) - 23 минуты
4 таба (~700 объектов) - 3 минуты

И это нормально?
Если закоментить тот самый ui->setupUi то все будет быстро и замечательно. (компиляция менее 1 минуты)
Для Qt это нормальная скорость пересборки интерфейса?

Просто к моменту завершения программы, у меня на форме будет порядка 6000 объектов, и мне что-то страшно.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: ритт от Июнь 26, 2009, 16:19
однозначно, проблема не в мингв, а у автора с манерой написания

> Просто к моменту завершения программы, у меня на форме будет порядка 6000 объектов, и мне что-то страшно.
мне тоже страшно...представить себе такой диалог...


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 16:23
Ну не хотелось мне создавать все это динамически.

Т.е. столь большое время компиляции прямое следствие большого числа объектов на форме?
Если да, то перепишу на динамику, шож делать.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: ритт от Июнь 26, 2009, 16:25
а можно увидеть h/cpp с этим-самым ui->setupUi() ?


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 16:31
Это те файлы, что создаются при создании нового GUI проекта.

cpp-файл
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

//-----------------------------------------------------------------------------------------------------------
//Конструктор
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    QDomDocument m_XMLFile("XMLFile");
    m_CurrentTab = 0;//Текущий таб 0

    ui->setupUi(this);

    //Привязка экшнов меню к слотам
    //Меню Файл
    connect(ui->actionOpen_File,SIGNAL(triggered()), this, SLOT(OpenFile()));
    connect(ui->actionSave_File,SIGNAL(triggered()),this,SLOT(Save()));ui->actionSave_File->setEnabled(false);
    connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(Quit()));
    //Меню Модуль
    ui->actionStartModule->setEnabled(false);
    //Меню Справка
    ui->actionAbout->setEnabled(false);
    ui->actionAbout_Qt->setEnabled(false);

    //Привязка экшнов дерева
    connect(ui->m_XMLTree,SIGNAL(itemSelectionChanged()),this,SLOT(m_XMLTreeChange()));

    //Привязка экшенов табов
    //Таб Text
    connect(ui->m_btnTextTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseTextTitleBgcolor()));
    connect(ui->m_btnTextHintBgcolor,SIGNAL(clicked()),this,SLOT(ChooseTextHintBgcolor()));
    connect(ui->m_btnTextParamSrc,SIGNAL(clicked()),this,SLOT(ChooseTextParamSrc()));
    connect(ui->m_btnTextHintSrc,SIGNAL(clicked()),this,SLOT(ChooseTextHintSrc()));
    connect(ui->m_btnTextAction0,SIGNAL(clicked()),this,SLOT(AddTextAction0()));
    connect(ui->m_btnTextAction1,SIGNAL(clicked()),this,SLOT(AddTextAction1()));
    connect(ui->m_btnTextAction2,SIGNAL(clicked()),this,SLOT(AddTextAction2()));
    connect(ui->m_btnTextAction3,SIGNAL(clicked()),this,SLOT(AddTextAction3()));
    connect(ui->m_btnTextAction4,SIGNAL(clicked()),this,SLOT(AddTextAction4()));
    connect(ui->m_btnTextAction5,SIGNAL(clicked()),this,SLOT(AddTextAction5()));
    connect(ui->m_btnTextAction6,SIGNAL(clicked()),this,SLOT(AddTextAction6()));
    connect(ui->m_btnTextAction7,SIGNAL(clicked()),this,SLOT(AddTextAction7()));
    //Таб Image
    connect(ui->m_btnImageTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseImageTitleBgcolor()));
    connect(ui->m_btnImageHintBgcolor,SIGNAL(clicked()),this,SLOT(ChooseImageHintBgcolor()));
    connect(ui->m_btnImageParamSrc,SIGNAL(clicked()),this,SLOT(ChooseImageParamSrc()));
    connect(ui->m_btnImageHintSrc,SIGNAL(clicked()),this,SLOT(ChooseImageHintSrc()));
    connect(ui->m_btnImageAction0,SIGNAL(clicked()),this,SLOT(AddImageAction0()));
    connect(ui->m_btnImageAction1,SIGNAL(clicked()),this,SLOT(AddImageAction1()));
    connect(ui->m_btnImageAction2,SIGNAL(clicked()),this,SLOT(AddImageAction2()));
    connect(ui->m_btnImageAction3,SIGNAL(clicked()),this,SLOT(AddImageAction3()));
    connect(ui->m_btnImageAction4,SIGNAL(clicked()),this,SLOT(AddImageAction4()));
    connect(ui->m_btnImageAction5,SIGNAL(clicked()),this,SLOT(AddImageAction5()));
    connect(ui->m_btnImageAction6,SIGNAL(clicked()),this,SLOT(AddImageAction6()));
    connect(ui->m_btnImageAction7,SIGNAL(clicked()),this,SLOT(AddImageAction7()));
    //Таб Audio
    connect(ui->m_btnAudioTitleBgcolor,SIGNAL(clicked()),this,SLOT(ChooseAudioTitleBgcolor()));
    connect(ui->m_btnAudioParamSrc,SIGNAL(clicked()),this,SLOT(ChooseAudioParamSrc()));
    connect(ui->m_btnAudioAction0,SIGNAL(clicked()),this,SLOT(AddAudioAction0()));
    connect(ui->m_btnAudioAction1,SIGNAL(clicked()),this,SLOT(AddAudioAction1()));


    //Настройка доступности табов в начале
    for (int i = 1; i < ui->m_tabwTags->count();i++)
        ui->m_tabwTags->setTabEnabled(i,false);

    ui->m_tabText->setVisible(false);
}
//-----------------------------------------------------------------------------------------------------------
//Деструктор
MainWindow::~MainWindow()
{
    delete ui;
}

h-файл
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QTreeWidget>
#include <QList>
#include <QtXml>
#include <QFileDialog>
#include <QColorDialog>

namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    //Основные функции
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void SaveChanges();//mainFuncSaveChanges.cpp

    //Вспомогательные функции : MainWindowOtherFunc.cpp
    void createXMLTree(QTreeWidgetItem*, QDomNode);
    QString GetLastParent(QTreeWidgetItem*);
    QDomNode GetLastParentXML(QDomNode);
    int GetNodeCounted(QDomNodeList);
    QDomNode SelectedNode(QDomNodeList, int);
    int XMLTreeNodeCounted(QTreeWidgetItem*);
    int XMLTreeChildSelected(QTreeWidgetItem*);
    int XMLTreeSelectInd();
    void SelectTreeNode(QTreeWidgetItem*, int);
    void IdLoad(QDomNode);


public slots:
    virtual void m_XMLTreeChange();//mainFuncXMLTreeChanges.cpp
    //MainMenuSlots.cpp
    virtual void OpenFile();
    virtual void Save();
    virtual void Quit();

    //Слоты для Text : tabText.cpp
    virtual void ChooseTextTitleBgcolor();
    virtual void ChooseTextHintBgcolor();
    virtual void ChooseTextParamSrc();
    virtual void ChooseTextHintSrc();
    virtual void AddTextAction0();
    virtual void AddTextAction1();
    virtual void AddTextAction2();
    virtual void AddTextAction3();
    virtual void AddTextAction4();
    virtual void AddTextAction5();
    virtual void AddTextAction6();
    virtual void AddTextAction7();

    //Слоты для Image : tabImage.cpp
    virtual void ChooseImageTitleBgcolor();
    virtual void ChooseImageHintBgcolor();
    virtual void ChooseImageParamSrc();
    virtual void ChooseImageHintSrc();
    virtual void AddImageAction0();
    virtual void AddImageAction1();
    virtual void AddImageAction2();
    virtual void AddImageAction3();
    virtual void AddImageAction4();
    virtual void AddImageAction5();
    virtual void AddImageAction6();
    virtual void AddImageAction7();

    //Слоты для Audio : tabAudio.cpp
    virtual void ChooseAudioTitleBgcolor();
    virtual void ChooseAudioParamSrc();
    virtual void AddAudioAction0();
    virtual void AddAudioAction1();

private:
    Ui::MainWindow *ui;
    QDomDocument m_XMLFile;
    QDomNodeList m_NodeList;//Список корневых узлов XML документа
    QDomNode m_NodeSelected;//Выбранный тег
    QDomNode m_NodeParentSelected;//Основной родитель выбранного тега
    int m_CurrentTab;//Номер текущего таба
    QString m_strFileName,//Имя рабочего файла
            m_strModuleDir,//Папка модуля
            m_strModuleSrcDir;//Папка ресурсов модуля
};

#endif // MAINWINDOW_H

Все это под виндой делаю.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Rcus от Июнь 26, 2009, 16:41
Помоему надо не это смотреть, а вывод uic (ui_*.h), чувствую компилятору плохо от большого количества переменных в одном классе/методе.
Я бы разнес табы по разным классам, так легче будет организовать раздельную компиляцию, а actions разделяемые разными табами организовать в коллекции.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Июнь 26, 2009, 16:52
К теме не относится, просто наблюдение.
Код
C++ (Qt)
   connect(ui->m_btnImageAction0,SIGNAL(clicked()),this,SLOT(AddImageAction0()));
   connect(ui->m_btnImageAction1,SIGNAL(clicked()),this,SLOT(AddImageAction1()));
   connect(ui->m_btnImageAction2,SIGNAL(clicked()),this,SLOT(AddImageAction2()));
   connect(ui->m_btnImageAction3,SIGNAL(clicked()),this,SLOT(AddImageAction3()));
   connect(ui->m_btnImageAction4,SIGNAL(clicked()),this,SLOT(AddImageAction4()));
   connect(ui->m_btnImageAction5,SIGNAL(clicked()),this,SLOT(AddImageAction5()));
   connect(ui->m_btnImageAction6,SIGNAL(clicked()),this,SLOT(AddImageAction6()));
   connect(ui->m_btnImageAction7,SIGNAL(clicked()),this,SLOT(AddImageAction7()));
 

Вместо этих портянок достаточно одного слота и QButtonGroup/QActionGroup, в который можно объединить в design mode.
Я всё-таки думаю, что проблема долгой компиляции в том, что постоянно редактируется .ui форма, которая в свою очередь влияет на ui_*.h файл. Муки должны закончится, когда интерфейс будет полностью готов.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 17:12
А
Цитировать
Вместо этих портянок достаточно одного слота и QButtonGroup/QActionGroup, в который можно объединить в design mode.
и
Цитировать
а actions разделяемые разными табами организовать в коллекции.

Это об одном?
В design mode не углядел нчие такого, мож плохо смотрел.

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


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Июнь 26, 2009, 17:21
В design mode не углядел нчие такого, мож плохо смотрел.
В любом случае, оно не критично, лишь повышает удобство восприятия кода, на мой взгляд.

Для кнопок "Assign To Button Group", а для экшенов такого почему-то не сделали. Но думаю не будет проблемой получить список через QWidget::actions() и через foreach добавить в QActionGroup.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 18:22
Я бы разнес табы по разным классам, так легче будет организовать раздельную компиляцию.

Ни у кого под рукой ссылки на пример подобной реализации элементов интерфейса в разных классах?


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Rcus от Июнь 26, 2009, 18:36
Мне известно два источника открытого кода с использованием Qt: примеры (Tab Dialog Example) и kde (kmldonkey, ktorrent) :)


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: break от Июнь 26, 2009, 20:36
В вашем случае 100% надо разносить на разные виджеты содержимое каждого таба. И там никаких сложностей у QTabWidget есть метод
Код:
int addTab ( QWidget * page, const QString & label )
В него передается указатель на внутренний виджет. Каждая форму может быть оформлена несколькими способами - от стандартной обертки с h и cpp файлом до динамической загрузки ui. Главное получить указатель на потомка QWidget и всунуть его в таб.
У меня в программе в цикле работает такой код
Код:
		CInstr_TrainControlForm* pTC_Props_Form = new CInstr_TrainControlForm( this );
pTC_Props_Form->show();

// добавляем окошко в "ТАБы"
ui.twTrainControls->addTab( pTC_Props_Form, QIcon(":/images/train.png"), sDescript );

У меня создаются одинаковые подтабы - внутри каждого кстати тоже QTabWidget-ы. В вашем случае они просто будут разными классами.

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

Хотя я даже не верю что столько времени займет компиляция вашего проекта - какой средой вы пользуетесь? Какая ОС? Сколько памяти и какой процессор? А то может у вас и Хелло Ворд не быстро собирается?


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 26, 2009, 20:53
2break

Спасибо за Ваш ответ. Видимо так и придется делать. Одна единственная форма с тысячами виджетов не прокатила.

По поводу машины, те времена что я указал справедливы для P4 3GHz, 1Gb оперативной.
Другие, более мощные машины (Intel Core 2 Duo + 1,5 Gb) компилят этот же проект минут за 7.(дебаг версия, релиза даже там не долждался)

Для интереса, постораюсь провернуть подобное на Builder'е, посмотрим сколько компилится там.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: break от Июнь 26, 2009, 21:00
"P4 3GHz, 1Gb оперативной." - да машина норм. Значит действительно 1 форма с кучей компонент не решение. Но наверное ее и поддерживать через пол года в таком виде будет тяжело. Я как бы сам люблю дизайнер - мне приходилось делать имуляторы реальных устройств - и эти устройства не были идеалом дизайна - там все изначально было криво и необходимо было реализовать также. Дизайнер выручал. Но честно не представляю как вы в нем такое огромное количество виджетов расставили - для меня 100 элементов стоящих рядом - это уже кошмар - и не дай бог потребуется между 50 и 51 впихнуть еще одного QLabel, QButton и др....


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: ритт от Июнь 26, 2009, 21:49
Арктус, а можно компилябельный проектик с этой формой приложить? ну, не верится мне, что форма может компилится 7 минут...попробую у себя


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: break от Июнь 26, 2009, 22:48
Я бы тоже проверил...


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 27, 2009, 03:39
Потестил я тут на свою голову...

Исходный хлам: P4-3GHz, 1Gb оперативки.

Исходные данные: Создается новый проект, на форму в табы накиданы Label, ComboBox, Edit, Button. Просто накидал в дизайнере. Своего кода нет.

Builder6:
На форме:
Label: 2604
Edit: 1302
ComboBox: 1302
Button: 490
Общее количество объектов на форме: 5698
Плюс пара десятков табов
Время компиляции 3-5 секунд. (дебаг), 30 секунд (релиз)

QtCreator (тот что в комплекте Qt SDK by NOKIA 2009.03)
На форме:
Label: 1440
Edit: 720
ComboBox: 720
Button: 528
Общее количество объектов на форме: 3408
Плюс пара десятков табов
Время компиляции: 4 часа 5 минут 30 секунд (дебаг версия, релиз запускать как-то боязно)

Обе IDE установлены из коробки, никаких настроек.

Кто-нибудь может провернуть подобный тест?
Хорошо бы было Qt-проект попробовать на студии собрать. Я всеж пока склоняюсь к тому, что уши от MinGW растут. (либо есть какие-то шаманства при настройке, которые надо сделать)
В разгар компиляции, процесс отжирал себе до 800 мб оперативной памяти.

Арктус, а можно компилябельный проектик с этой формой приложить? ну, не верится мне, что форма может компилится 7 минут...попробую у себя
Я его тут в пылу борьбы того... копия только на работе. Если после вышеизложенного все еще интересно, в понедельник могу подкинуть.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Rcus от Июнь 27, 2009, 07:19
После пары минут компиляции сомнения как-то начали развеиваться, но gcc-4.3.3 справился за 5 минут.
Хотя конечно один взгляд на вывод uic проясняет суть дела, файл в 29KLoC это жесть :)
Прилагаю ui файл для теста.
Запускать не пробовал, боюсь oom :)


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: uriel от Июнь 27, 2009, 09:31
Сурово. :)
GCC 4.4.0 в релизе собрал за 3:23, а в дебаге - 0:11.
Oom, кстати, никакого нет - оно всего 6 метров кушает. :)


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 27, 2009, 11:46
Взял ui файл предложенный Rcus. Кстати, спс за него, подчерпнул кое что для себя новое, в плане работы в дизайнере.

Запихнул в проект, начал компиляцию.
Получаю такое дерево процессов:
mingw32-make.exe -> mingw32-make.exe -> cmd.exe -> g++.exe -> cc1plus.exe

Этот cc1plus.exe отработал полтора часа, и мне надоело как-то. Учитывая что там объектов больше чем у меня было, даже не хочу думать, как долго оно бы длилось. На пике активности cc1plus.exe затребовал 673 Мб.

Для интереса усек форму немного.
4 таба (900 объектов): время 240 секунд и 159 Мб памяти.
3 таба (670 объектов): время 102 секунды и 126 Мб памяти
2 таба (450 объектов): время 33 секунды и 99 Мб памяти.

Таки интересно, в чем трабл. Откуда такие бешенные времена идут.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: pastor от Июнь 27, 2009, 11:56
Попробовал и я под виндой:

Intel Core 2 Quad Q6600 (2,40 ГГц), 8 Gb оперативки, Qt 4.5.1, MSVC 2008 + SP1

1) Debug - 2:35 мин, съело 160 метров при линковке
2) Release - подождал 5 мин и прервал сборку, т.к. стало съедать память огромными темпами (съело 4 гига оперативки).


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Rcus от Июнь 27, 2009, 12:35
Таки интересно, в чем трабл. Откуда такие бешенные времена идут.

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

И почему так быстро работает BCC+VCL понятно: там весь код инициализации виджетов находится в .dfm файле. Интересно кстати посмотреть, запустится ли пример VCL на загруженной системе: вполне может сработать ограничение на количество GDI объектов в системе


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 27, 2009, 12:44
Думаю тут проблема в размере генерируемого класса. Я внутренностей gcc не знаю, но думаю класс размером в тысячи слов это крайне атипичное явление. Вполне может быть неоптимальное заполнение таблицы символов при трансляции, что вызывает нелинейную деградацию скорости.

И почему так быстро работает BCC+VCL понятно: там весь код инициализации виджетов находится в .dfm файле. Интересно кстати посмотреть, запустится ли пример VCL на загруженной системе: вполне может сработать ограничение на количество GDI объектов в системе

К вопросу о BCC, тот пример на Builder6, с 5600+ объектами, dfm файл содержит почти 45 тысяч строк. Скорость обработки 5 секунд на дебаг, 30 на релиз с оптимизацией кода на скорость. Размер получающегося exe файла 1,07 Мб.
При запуске экзешник занимает всего 53 GDI Handels (если я правильно понял, о чем Вы) и 6 Мб оперативной памяти.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Июнь 27, 2009, 21:39
Тоже провел тест:
GCC 4.4.0
debug - 27 сек, пиковое использование памяти 500Mb
release - 6 мин, пиковое использование памяти ~1Gb
---
С выключеной оптимизацией (-O0) release - 23 секунды.

Тачка: Intel Core 2 CPU 6400 2.13GHz, RAM 2Gb, Windows XP, консоль cmd
---
Для эксперимента решил попробовать использовать новую фичу GCC 4.4.0 - точечную оптимизацию. Открыл файл ui_untitled.h и проставил методу setupUi нулевую оптимизацию:

Код:
void setupUi(QMainWindow *MainWindowClass) __attribute__((__optimize__("O0")))

Не смотря на то, что сама программа собиралась с ключом оптимизации -O2 - программа в релизе собралась за 33 секунды.
В аттаче компилируемый пример, для тех кто еще захочет потестить.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: break от Июнь 27, 2009, 22:12
Взял пример из предудыщего сообщения
debug - секунд 30
release - Cannot allocate memory - после 2-х минут

Intel Core 2 Duo, 4GB, Ubuntu 8.04, QtCreator 1.2


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Июнь 28, 2009, 12:19
Пока я могу лишь предложить такое временное решение для компилятора gcc:

Код
C++ (Qt)
OPTIMIZE += no
 
contains(OPTIMIZE, no) {
   *-g++*{
   QMAKE_CFLAGS_RELEASE ~= s,-O.,-O0,
   QMAKE_CXXFLAGS_RELEASE ~= s,-O.,-O0,
   QMAKE_OBJECTIVE_CFLAGS_RELEASE ~= s,-O.,-O0
   }
 

Это надо прописать в .pro файле. Должно отключить оптимизацию для release билдов полностью. Уменьшит время компиляции, а когда захочешь выпустить готовую программу, то в переменной OPTIMIZE присваивай yes  (или что-то отличное от no) и собирай.

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


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: Арктус от Июнь 28, 2009, 19:27
Увы, при исходных условиях, когда дебаг собирается под час и выше, это уже не сильно изменит расклад.
Но все равно, спс.


Название: Re: Вопрос о скорости компиляции и загруженности формы
Отправлено: SABROG от Август 05, 2009, 13:36
Обнаружил интересную поделку (http://www.qt-apps.org/content/show.php/SplitUI?content=61344) позволяющую сократить время компиляции. Смысл в том, что создается несколько хедеров вместо одно.