Russian Qt Forum
Ноябрь 22, 2024, 23:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как правильно собрать Qt из исходников?  (Прочитано 12408 раз)
danilsl
Гость
« : Август 01, 2016, 21:01 »

Всем привет.
Вопрос растёт вот откуда: пишу прогу конвертер. Так как оперативы хватает, с промежуточными данными не заморачиваюсь. Прога при работе создаёт порядка полумиллиона динамических структур, которые держит в оперативе. В каждой структуре сидит поле QByteArray. Так вот. Если я собираю эту прогу с библиотекой 5.2.1, которая из репозиториев ubuntu 14.04 64-bit, при работе она хавает около 200 метров оперативы. А вот если собираю её с библиотекой 5.6.1, которую сам компилил во всё той же убунте, она на тех же данных жрёт гиг. Ради интереса проверил под виндой 7, там стоит тоже 5.6.1, но не самосборная, бинарниками ставил с mingw32, там хавает ещё меньше, чуть больше 150 метров.
Вот я и думаю, собраться библиотека у меня собралась, но в дефолтных настройках сборки стоит слишком большая цифра, сколько памяти изначально жрать под пустой QByteArray. Кто-нибудь сможет подсказать как решить эту проблему?
Записан
Bepec
Гость
« Ответ #1 : Август 01, 2016, 23:08 »

Слишком большая цифра чего?
Объема пустого места занимаемого QByteArray? Врядли.
Тут может влять выравнивание, но это уже вопрос к компилятору.
Записан
danilsl
Гость
« Ответ #2 : Август 02, 2016, 00:22 »

Слишком большая цифра чего?
Объема пустого места занимаемого QByteArray? Врядли.
Тут может влять выравнивание, но это уже вопрос к компилятору.
Интересная версия...
Я собирал системным компилятором, никаких линаро и тому подобных приблуд не ставил. И я подозреваю, что репозиторная библиотека собрана им же.
По поводу циферки может и не правильно выразился. Имелась в виду циферка - размер запрашиваемой по дефолту памяти у ядра для размещения динамического объекта. Я не очень хорошо понимаю эту механику, но где-то читал, что для объектов с изменяющимся размером данных, типа QByteArray, изначально запрашивается кусок памяти определённого размера. Или выделяется в уже имеющейся куче. С учётом прогнозируемого роста размера данных. Причём непрерывный. Даже для пустого объекта. И я подозреваю, что моя сборка для каждого QByteArray просит раза в 4 больше места, чем системная сборка. И в итоге это место тупо не используется. Средний размер моих QByteArray'ев 32 байта. Вопрос сколько выделяется под пустышку? И как это поправить. Скорее всего есть какой-то дефайн, скармливаемый компилятору (-DDEFINENAME=value), который за это отвечает.
А с выравниванием врядли, что там, что там 4 байта стоит, специально проверил, #pragma(pack) не пользовал.
С другой стороны эти байтмассивы лежат в QMap. А вот тут наверное актуален вопрос выравнивания. Но как это хотя бы проверить?
Попробую завтра запихать в QMap указатели вместо объектов, вдруг поможет... Если потребление вырастет не сильно (QMap'ов всего 7, а вырастет имхо за счёт того что ещё полляма указателей кроме всего прочего хранить нада), значит моя первоначальная версия правильная.
Проверил на Cortex-a9, тоже самосборная библиотека 5.6.1, жрёт ~170 метров...\
Вопрос в чём разница?
« Последнее редактирование: Август 02, 2016, 00:48 от danilsl » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Август 02, 2016, 01:18 »

Вот в доке стоит такое:

When you append() data to a non-empty array, the array will be reallocated and the new data copied to it. You can avoid this behavior by calling reserve(), which preallocates a certain amount of memory. You can also call capacity() to find out how much memory QByteArray actually allocated. Data appended to an empty array is not copied.

можно попробовать reserve(32) и посмотреть, что говорит capacity() ...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
danilsl
Гость
« Ответ #4 : Август 02, 2016, 01:31 »

Вот в доке стоит такое:

When you append() data to a non-empty array, the array will be reallocated and the new data copied to it. You can avoid this behavior by calling reserve(), which preallocates a certain amount of memory. You can also call capacity() to find out how much memory QByteArray actually allocated. Data appended to an empty array is not copied.

можно попробовать reserve(32) и посмотреть, что говорит capacity() ...
append'ов нету, тупо QFile::readLine(). Дальше это путешествует по функциям в виде const QByteArray &.
Но завтра буду пытать все версии
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 02, 2016, 07:07 »

Средний размер моих QByteArray'ев 32 байта. Вопрос сколько выделяется под пустышку?
Узнайте "из первых рук" QByteArray::capacity

И как это поправить.
QByteArray::squeeze() хотя она может и не освобождать память (в старых OC так было)
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Август 02, 2016, 08:15 »

в дефолтных настройках сборки стоит слишком большая цифра, сколько памяти изначально жрать под пустой QByteArray

как это ?

набросай простейший пример, а так говорить что пальцем в небо тыкать
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Август 02, 2016, 09:11 »

А попробуйте собрать с mingw64, интересно, сколько такая сборка будет потреблять.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #8 : Август 02, 2016, 13:26 »

Может банально debug версия собрана вручную?
И подгружается куча отладочной информации?
Записан
danilsl
Гость
« Ответ #9 : Август 02, 2016, 14:03 »

Всем привет.
Короче провёл кучу экспериментов, ни один разницы не показывает... Только моя прога на 5.6 столько жрёт. Теперь уже можно утверждать, что либа не обязательно должна быть самосборной. Установил в линукс официальный бинарник 5.6.1, картинка таже. В Ubuntu 16.04 64-bit в репах лежит версия 5.5.1, там нормально всё с памятью. Выше - жрёт. Но в винде 5.6 не жрёт, mingw64 компилится (надеюсь соберётся), посмотрю ещё там.
Насчёт дебага - хз. При компиляции библиотеки указываю опцию -release. При компиляции самой проги в дебаге растёт её бинарник, работает немного медленнее, но потребляемая память одинаковая.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #10 : Август 02, 2016, 15:21 »

QByteArray::capacity что говорит?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
danilsl
Гость
« Ответ #11 : Август 02, 2016, 16:29 »

Код:
#include <QCoreApplication>
#include "work.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
//    Work w;
//    w.gorgeMem();
    QByteArray ba;
    qDebug() << ba.capacity();
    float fff = 0;
    ba.append((const char *)&fff, sizeof(float));
    qDebug() << ba.capacity();
    ba.append((const char *)&fff, sizeof(float));
    qDebug() << ba.capacity();
    return a.exec();
}
Qt 5.2.1 x64 Ubuntu
0
7
39
Qt 5.6.0 x64 Ubuntu
0
7
39
Qt 5.6.1 x32 buildroot linux Cortex-a9
0
15
15
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Август 02, 2016, 16:58 »

Получается, что QByteArray как бы и не при чем..?
Кстати, а SVG-иконки случайно нигде не используются?
С ними у Qt проблемы с т.з. памяти.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Август 02, 2016, 17:45 »

А вот это "сожрало" - его никак нельзя детализировать? Напр в OSX есть штатное средство чтобы посмотреть какие блоки памяти приложение выделяло и сколько. Может само приложение жрет везде одинаково, а привязалась какая-то либа
Записан
danilsl
Гость
« Ответ #14 : Август 02, 2016, 17:52 »

А вот это "сожрало" - его никак нельзя детализировать? Напр в OSX есть штатное средство чтобы посмотреть какие блоки памяти приложение выделяло и сколько. Может само приложение жрет везде одинаково, а привязалась какая-то либа
А вот этого и мне хотелось бы... Только не знаю как. Пользую QtCreator 4.0.2 (Тоже самосборный ))))
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.241 секунд. Запросов: 22.