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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Частое создание экземпляров  (Прочитано 4151 раз)
alexeyvanzhula
Гость
« : Декабрь 02, 2014, 11:26 »

Пример:
в функции paintEvent постоянно создают, например, новый QPoint для использования в каких то опирациях рисования.
Если я знаю что QPoint в программе будет использоваться очень часто, почему бы мне не создать в конструкторе один экземпляр QPoint и пользоваться им везде, используя методы setX\Y для новых значений. Зачем в часто вызываемых методах создавать его заново?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 02, 2014, 11:27 »

А ты уверен, что создать экземпляр QPoint будет медленнее вызова двух методов?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
alexeyvanzhula
Гость
« Ответ #2 : Декабрь 02, 2014, 11:42 »

А ты уверен, что создать экземпляр QPoint будет медленнее вызова двух методов?

а если вызывать только один метод постоянно (не важно какого типа) тогда вероятнее всего что создание экземпляра каждый раз накладнее чем вызов метода?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 02, 2014, 11:45 »

Скорее всего, накладнее, но различие настолько мизерное, что тут даже не на спичках экономия. Это все преждевременная оптимизация, что есть зло.
« Последнее редактирование: Декабрь 02, 2014, 11:49 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 02, 2014, 12:10 »

а если вызывать только один метод постоянно (не важно какого типа) тогда вероятнее всего что создание экземпляра каждый раз накладнее чем вызов метода?
В случае QPoint создание не медленнее, а может и быстрее присваивания (т.к. подаются сразу 2 аргумента).

.. почему бы мне не создать в конструкторе один экземпляр QPoint и пользоваться им везде, используя методы setX\Y для новых значений. Зачем в часто вызываемых методах создавать его заново?
Такой экземпляр делает класс "not thread-safe", т.е. он не сможет работать корректно при параллельном выполнении. Хоть для paint это и не актуально, но в общем случае плохо
Записан
alexeyvanzhula
Гость
« Ответ #5 : Декабрь 02, 2014, 12:44 »

Цитировать
Такой экземпляр делает класс "not thread-safe", т.е. он не сможет работать корректно при параллельном выполнении. Хоть для paint это и не актуально, но в общем случае плохо
почему?
Записан
ammaximus
Гость
« Ответ #6 : Декабрь 03, 2014, 01:09 »

Есть несколько правил, которыми следует пользоваться в таких ситуациях.
1. Переменные должны быть видимы только в месте использования. То есть нет смысла засорять пространство класса, если переменная используется только в одной функции и совсем не нужна снаружи. Такой подход позволяет минимизировать количество ошибок и снизить связность кода.
2. Оптимизировать следует только то, что действительно нуждается в оптимизации. Если функция не тормозит на целевой платформе ничего делать не нужно.
3. Понятность кода важнее скорости работы. В настоящую эпоху важнее сделать код понятным, а следовательно снизить вероятность ошибок. Быстрая не правильно работающая программа никому не нужна.
4. С опытом появляется набор подходов, которые косвенно будут оптимизировать код. Например, не очень хорошо в пэйнт эвенте читать какието параметры из файла. Но вы уже используете конструктор и инициализируетесь там и это логично, и когда вы вернетесь к этому коду в первую очередь полезете именно в кокструктор. Просто потомучто это общепринятый подход. Выносить поинт не общепринято и при возвращении к коду у вас будут трудности.
5. Самое важное - то что вы написали в программе никогда не выполняется процессором дословно. Компиляторы настолько умны, что сами в состоянии сообразить когда вызывать конструктор а когда нет. И они закладываются на общепринятые принципы написания кода - если мудрить можно наоборот все испортить -компилятор вас не поймет и не выполнит автооптимизацию которая в разы круче всего, что можно наваять руками.
6. И наконец то что вы предлагаете не оптимально. Конструктор структуры QPoint выполняет те же операции присваивания, но делает это на стеке который точно в близком кеше или вообще в активных регистрах процессора, а за вашим QPoint придется лезть в оперативку грузить оттуда страницу и т.п.
Кстати, размер структуры 8 байт, так что вообще стоило ли заводить этот разговор? :-)
« Последнее редактирование: Декабрь 03, 2014, 01:12 от ammaximus » Записан
alexeyvanzhula
Гость
« Ответ #7 : Декабрь 03, 2014, 13:11 »

Цитировать
Кстати, размер структуры 8 байт, так что вообще стоило ли заводить этот разговор? :-)
Наверное стоило, потому что я кое что узнал Улыбающийся
Спасибо !!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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