Оптимизация операций в Qt |
Здравствуйте, гость ( Вход | Регистрация )
Оптимизация операций в Qt |
gigabyte |
27.1.2010, 17:12
Сообщение
#1
|
Студент Группа: Участник Сообщений: 20 Регистрация: 9.8.2009 Пользователь №: 992 Спасибо сказали: 2 раз(а) Репутация: 1 |
Собсно вопрос возник следующий в Qt есть определения типа qMin qMax
Чем они лучше чем простой int max = a>b ? a : b сомпилил простой пример под mingw посмотрел дебагером получаэтся что структура типа qMin показывает дизасемблером 10 операций а int max... - 13 Плюс вычилат где-то что структура ++i с точки зрения оптимизации лучше чем i++ Хотелось бы знать есть ли еще такие маленькие хирости которые позволяют ускорить, уменьшить и т.д. и т.п. P.S. Да я отдаю себе отчет в том что лучшая оптимизация это оптимизация логики работы самой программы но все же при все прочих равных условиях какие еще хитрости есть которые позволяют добится лучшего результата |
|
|
igor_bogomolov |
27.1.2010, 17:25
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Собсно вопрос возник следующий в Qt есть определения типа qMin qMax Чем они лучше чем простой int max = a>b ? a : b
Точно помню, в каком то справочнике читал, что ?: генерирует более оптимальный код при компиляции, чем if/else. Поэтому частенько использую ?:. Неужели я ошибался? Плюс вычилат где-то что структура ++i с точки зрения оптимизации лучше чем i++ Об этом тоже слышал, но только относительно stl итераторов. Еще слышал, что дикрементирующие циклы дают белее быстрый код при компиляции. В общем, поддерживаю вопрос. Тоже интересно мнение коллег |
|
|
gigabyte |
27.1.2010, 17:38
Сообщение
#3
|
Студент Группа: Участник Сообщений: 20 Регистрация: 9.8.2009 Пользователь №: 992 Спасибо сказали: 2 раз(а) Репутация: 1 |
Цитата Точно помню, в каком то справочнике читал, что ?: генерирует более оптимальный код при компиляции, чем if/else. Поэтому частенько использую ?:. Неужели я ошибался? Пример для проверки: Раскрывающийся текст #include <stdio.h> int domax(int a,int { int max = a>b ? a : b; return max; } int domax1(int a,int { if(a>b) return a; return b; } int main() { int a = 100; int b = 200; printf("result: %d",domax(a,); printf("result: %d",domax1(a,); } компилил так:
проверял через gdb. через step доходил до определенной функции и смотрел на disas (тупо посчитал строки т.е. команды) Если где то ошибся, скажите где |
|
|
igor_bogomolov |
27.1.2010, 17:50
Сообщение
#4
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
В domax лишнее создание переменной.
Можно просто написать return a>b ? a : b;, тогда компилятор сгенерирует идентичный код. По крайней мере вывод objdamp -d для обоих функций одинаков. Сообщение отредактировал igor_bogomolov - 27.1.2010, 17:58 |
|
|
SABROG |
27.1.2010, 18:04
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Про оптимизацию тут хорошо расписано.
Тролли используют этот код:
Вместо этого:
Не просто так. Цитата #
Be extremely careful when using the questionmark operator. If the returned types aren’t identical, some compilers generate code that crashes at runtime (you won’t even get a compiler warning). QString s; return condition ? s : "nothing"; // crash at runtime - QString vs. const char * Сообщение отредактировал SABROG - 27.1.2010, 18:11 |
|
|
gigabyte |
27.1.2010, 18:46
Сообщение
#6
|
Студент Группа: Участник Сообщений: 20 Регистрация: 9.8.2009 Пользователь №: 992 Спасибо сказали: 2 раз(а) Репутация: 1 |
|
|
|
Litkevich Yuriy |
27.1.2010, 18:48
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
CrackedMind |
28.1.2010, 7:48
Сообщение
#8
|
Студент Группа: Участник Сообщений: 44 Регистрация: 13.3.2009 Пользователь №: 611 Спасибо сказали: 7 раз(а) Репутация: 0 |
Цитата Плюс вычилат где-то что структура ++i с точки зрения оптимизации лучше чем i++ Это касается сложных структур данных с тяжелыми конструкторами. Т.к. ++i возвращает ссылку на объект, а i++ создает новый. |
|
|
Sergey B. |
28.1.2010, 9:45
Сообщение
#9
|
Студент Группа: Новичок Сообщений: 16 Регистрация: 12.2.2008 Пользователь №: 92 Спасибо сказали: 1 раз(а) Репутация: 0 |
Из Страуструппа
Отметим, что пост-инкремент (постфиксный оператор ++) использует промежу- точную переменную, а пре-ипкремент (префиксный оператор ++) нет. По этой при- чине, для итераторов предпочтительнее ++р, а ыер++. |
|
|
JuryS1806 |
29.1.2010, 18:13
Сообщение
#10
|
Студент Группа: Участник Сообщений: 93 Регистрация: 21.10.2009 Из: Нижний Новгород Пользователь №: 1168 Спасибо сказали: 9 раз(а) Репутация: 0 |
А я вот давно задаюсь вопросом: часто использую постоянные составляющие функций.
К примеру const QString, const int, const QMenu* и т.д. Это может быть более оптимальным решением, чем использовать просто QString, int и т.д. Или я ошибаюсь ? И еще вот такой вопрос: не желательно ли в принципе использовать статические функции, к примеру для того же класса MainWindow ? К примеру буду хранить настройки в статических QString, int и т.д. и при обращении к ним из других классов буду брать их из класса MainWindow . Или это совсем отрицательно сказывается на производительности ? |
|
|
Текстовая версия | Сейчас: 28.1.2025, 19:17 |