Russian Qt Forum
Ноябрь 24, 2024, 11:46
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Частое создание экземпляров
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Частое создание экземпляров (Прочитано 4143 раз)
alexeyvanzhula
Гость
Частое создание экземпляров
«
:
Декабрь 02, 2014, 11:26 »
Пример:
в функции paintEvent постоянно создают, например, новый QPoint для использования в каких то опирациях рисования.
Если я знаю что QPoint в программе будет использоваться очень часто, почему бы мне не создать в конструкторе один экземпляр QPoint и пользоваться им везде, используя методы setX\Y для новых значений. Зачем в часто вызываемых методах создавать его заново?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Частое создание экземпляров
«
Ответ #1 :
Декабрь 02, 2014, 11:27 »
А ты уверен, что создать экземпляр QPoint будет медленнее вызова двух методов?
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alexeyvanzhula
Гость
Re: Частое создание экземпляров
«
Ответ #2 :
Декабрь 02, 2014, 11:42 »
Цитата: Пантер от Декабрь 02, 2014, 11:27
А ты уверен, что создать экземпляр QPoint будет медленнее вызова двух методов?
а если вызывать только один метод постоянно (не важно какого типа) тогда вероятнее всего что создание экземпляра каждый раз накладнее чем вызов метода?
Записан
Пантер
Administrator
Джедай : наставник для всех
Offline
Сообщений: 5876
Жаждущий знаний
Re: Частое создание экземпляров
«
Ответ #3 :
Декабрь 02, 2014, 11:45 »
Скорее всего, накладнее, но различие настолько мизерное, что тут даже не на спичках экономия. Это все преждевременная оптимизация, что есть зло.
«
Последнее редактирование: Декабрь 02, 2014, 11:49 от Пантер
»
Записан
1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Частое создание экземпляров
«
Ответ #4 :
Декабрь 02, 2014, 12:10 »
Цитата: alexeyvanzhula от Декабрь 02, 2014, 11:42
а если вызывать только один метод постоянно (не важно какого типа) тогда вероятнее всего что создание экземпляра каждый раз накладнее чем вызов метода?
В случае QPoint создание не медленнее, а может и быстрее присваивания (т.к. подаются сразу 2 аргумента).
Цитата: alexeyvanzhula от Декабрь 02, 2014, 11:26
.. почему бы мне не создать в конструкторе один экземпляр QPoint и пользоваться им везде, используя методы setX\Y для новых значений. Зачем в часто вызываемых методах создавать его заново?
Такой экземпляр делает класс "not thread-safe", т.е. он не сможет работать корректно при параллельном выполнении. Хоть для paint это и не актуально, но в общем случае плохо
Записан
alexeyvanzhula
Гость
Re: Частое создание экземпляров
«
Ответ #5 :
Декабрь 02, 2014, 12:44 »
Цитировать
Такой экземпляр делает класс "not thread-safe", т.е. он не сможет работать корректно при параллельном выполнении. Хоть для paint это и не актуально, но в общем случае плохо
почему?
Записан
ammaximus
Гость
Re: Частое создание экземпляров
«
Ответ #6 :
Декабрь 03, 2014, 01:09 »
Есть несколько правил, которыми следует пользоваться в таких ситуациях.
1. Переменные должны быть видимы только в месте использования. То есть нет смысла засорять пространство класса, если переменная используется только в одной функции и совсем не нужна снаружи. Такой подход позволяет минимизировать количество ошибок и снизить связность кода.
2. Оптимизировать следует только то, что действительно нуждается в оптимизации. Если функция не тормозит на целевой платформе ничего делать не нужно.
3. Понятность кода важнее скорости работы. В настоящую эпоху важнее сделать код понятным, а следовательно снизить вероятность ошибок. Быстрая не правильно работающая программа никому не нужна.
4. С опытом появляется набор подходов, которые косвенно будут оптимизировать код. Например, не очень хорошо в пэйнт эвенте читать какието параметры из файла. Но вы уже используете конструктор и инициализируетесь там и это логично, и когда вы вернетесь к этому коду в первую очередь полезете именно в кокструктор. Просто потомучто это общепринятый подход. Выносить поинт не общепринято и при возвращении к коду у вас будут трудности.
5. Самое важное - то что вы написали в программе никогда не выполняется процессором дословно. Компиляторы настолько умны, что сами в состоянии сообразить когда вызывать конструктор а когда нет. И они закладываются на общепринятые принципы написания кода - если мудрить можно наоборот все испортить -компилятор вас не поймет и не выполнит автооптимизацию которая в разы круче всего, что можно наваять руками.
6. И наконец то что вы предлагаете не оптимально. Конструктор структуры QPoint выполняет те же операции присваивания, но делает это на стеке который точно в близком кеше или вообще в активных регистрах процессора, а за вашим QPoint придется лезть в оперативку грузить оттуда страницу и т.п.
Кстати, размер структуры 8 байт, так что вообще стоило ли заводить этот разговор? :-)
«
Последнее редактирование: Декабрь 03, 2014, 01:12 от ammaximus
»
Записан
alexeyvanzhula
Гость
Re: Частое создание экземпляров
«
Ответ #7 :
Декабрь 03, 2014, 13:11 »
Цитировать
Кстати, размер структуры 8 байт, так что вообще стоило ли заводить этот разговор? :-)
Наверное стоило, потому что я кое что узнал
Спасибо !!!
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...