2013-09-09 4 views
0

Для сопоставления нескольких пользовательских сигналов в одном слоте в qt i в основном есть два варианта: QSignalMapper или литой из указателя senderID (см .: http://doc.qt.digia.com/qq/qq10-signalmapper.html).QSignalMapper vs. grabbing senderId Производительность

Мой вопрос: что представляет собой более эффективный код? Я хочу использовать его в timecritical разделе моей программы.

Должен ли я использовать отдельные сигналы/слоты для оптимизации кода?

Заранее спасибо.

ответ

0

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

Если ваше соединение с сигнальным слотом вызывается порядка 1000 раз в секунду, вы можете делать практически все, что захотите - накладные расходы не будут иметь значения. Это только начинает иметь значение, если вы находитесь в 100k invocations/second range, а затем, вероятно, вы ошибочно разрабатываете вещи.

Соединение сигнального слота без каких-либо параметров всегда быстрее, чем одно, которое отправляет некоторые параметры. Вы можете просто добавить свойство к объекту отправителя с помощью динамической системы свойств и проверить это свойство, используя sender()->property("..."). Динамический поиск свойств занимает немного больше времени, чем при использовании qobject_cast<...>(sender()), и вызов функции-члена в настраиваемом классе QObject или QWidget. Но это несущественно, потому что, если вы не можете измерить разницу, вам не нужно беспокоиться об этом. Преждевременная оптимизация - это действительно корень всего зла.

+0

Вы правы: Мой ответ на большинство подобных вопросов также: «не оптимизируйте, если у вас действительно есть проблема и определенно знаете, что это причина». Однако мне было просто интересно, есть ли простой ответ, который заключается в реализации преобразователя сигналов или senderId, который очень дорог (с использованием RTTI и таблиц поиска или что-то в этом роде), которых следует избегать при часто называемых (> 1000 на scond). Но спасибо вам за подсказку с свойством, которое я мог бы проверить, если есть проблема. До тех пор я останусь с qsignalmapper и qobject_cast, который, похоже, работает. – TWE