WedX - журнал о программировании и компьютерных науках

Оптимизация потоков Qt

Я попытался профилировать одно из своих приложений с помощью Qt. Результаты, которые я нашел, показали, что Qt является большим пользователем Thread. Кажется, он много создает и уничтожает потоки. Это пик потребления памяти. Это правда ?

Итак, я попытался провести некоторое исследование на тему «как оптимизировать приложение Qt», но на данный момент я не нашел ничего подходящего.

Поэтому мне было интересно, есть ли какой-либо «общий способ» программирования с Qt, который можно было бы оптимизировать. Должен ли я использовать темы особым образом? Могу ли я сделать что-нибудь, кроме соблюдения стандартов C++, опций -pedantic в компиляторе и т. д.?


  • Вам придется начать с общих потоков оптимизации в C++. См., например, en.wikibooks.org/wiki/Optimizing_C%2B%2B /Написание_эффективного_кода/ 08.03.2013
  • Как вы его профилировали? 08.03.2013
  • Я использовал Very Sleepy и пробную версию VTune. Пробовал наблюдать за процессом и с помощью Process Explorer. Однако я не привык к этим инструментам... 08.03.2013
  • Вы создаете темы? 08.03.2013
  • Где-то да. Но теперь специально с или для Qt. Просто профилирование показало, что у KilDispatchInterrupt самый большой CPI. Затем идет QtEventDispatcherWin32. Поэтому я подумал, что это связано с Thread. Я считаю, что этот CPI связан с Qt. Но, может быть, я совершенно не прав. Что вы думаете ? 08.03.2013
  • Very Sleepy показывает общее время. Это означает, что если метод A введен в t = 0 с, затем метод A вызывает метод B в t = 1 с, метод B возвращает в t = 10 с, а метод A возвращает в t = 10 с, это покажет, что метод A занял 10 секунд, а метод B заняло 9 секунд. Я думаю, что есть возможность показать только время, фактически потраченное на этот метод. Как правило, Qt обычно имеет только один поток, который представляет собой цикл событий, который обрабатывает любое событие (щелчок мыши, запрос на рисование и т. д.). 08.03.2013
  • QtEventDispatcherWin32 — транслятор цикла событий из событий платформы в события Qt. Это будет вызываться много, даже если у вас есть только один поток 08.03.2013

Ответы:


1

Вообще говоря, если вы много создаете и уничтожаете потоки, то это, вероятно, не очень хороший дизайн. Предполагая, что ваши потоки делают одни и те же (или похожие) вещи, затем у вас есть фиксированный «пул» потоков, который работает столько времени, сколько потребуется, а затем возвращается в пул, когда ваш текущий код уничтожает поток.

Или пусть поток работает вечно и передает ему данные через какой-нибудь подходящий IPC.

Я бы также сказал, что если вы не делаете что-то очень особенное, если что-то занимает менее четверти секунды, то вам не следует создавать поток для этого. Это не фиксированное правило.

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

08.03.2013

2

Если вы часто создаете и уничтожаете QThreads, подумайте об использовании QThreadPool. или QtConcurrent. Они будут держать потоки в резерве и обслуживать их по запросу.

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

08.03.2013
  • Вы сказали моя проблема. Считается ли проблемой высокий CPI KillDispatchInterrupt? 09.03.2013
  • Не зная много о вашем коде, трудно понять, является ли это проблемой. Эта ссылка содержит некоторую информацию об этом процессе: groups.google.com/forum/?fromgroups#!topic/ 11.03.2013
  • Из поиска в Google я не могу сказать, является ли KiDispatchInterrupt операцией ввода-вывода или операцией Mutex. В любом случае это звучит так, как будто ваш процессор сидит и ждет, что что-то произойдет. 11.03.2013
  • Извините, я не специалист по аппаратному обеспечению или ядру, поэтому я не знаю большего. 11.03.2013
  • Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]