crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Оптимизация операций в 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  


Цитата(gigabyte @ 27.1.2010, 17:12) *
Собсно вопрос возник следующий в Qt есть определения типа qMin qMax
Чем они лучше чем простой int max = a>b ? a : b

template <typename T>
inline const T &qMin(const T &a, const T &b) { if (a < b) return a; return b; }
template <typename T>
inline const T &qMax(const T &a, const T &b) { if (a < b) return b; return a; }

Точно помню, в каком то справочнике читал, что ?: генерирует более оптимальный код при компиляции, чем if/else.
Поэтому частенько использую ?:. Неужели я ошибался?

Цитата(gigabyte @ 27.1.2010, 17:12) *
Плюс вычилат где-то что структура ++i с точки зрения оптимизации лучше чем i++
Об этом тоже слышал, но только относительно stl итераторов. Еще слышал, что дикрементирующие циклы дают белее быстрый код при компиляции.

В общем, поддерживаю вопрос. Тоже интересно мнение коллег :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gigabyte
  опции профиля:
сообщение 27.1.2010, 17:38
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 9.8.2009
Пользователь №: 992

Спасибо сказали: 2 раз(а)




Репутация:   1  


Цитата
Точно помню, в каком то справочнике читал, что ?: генерирует более оптимальный код при компиляции, чем if/else.
Поэтому частенько использую ?:. Неужели я ошибался?

Пример для проверки:
Раскрывающийся текст
#include <stdio.h>
int domax(int a,int B)
{
int max = a>b ? a : b;
return max;
}

int domax1(int a,int B)
{
if(a>b) return a;
return b;
}

int main()
{
int a = 100;
int b = 200;
printf("result: %d",domax(a,B));
printf("result: %d",domax1(a,B));
}

компилил так:
gcc -ggdb ./main.cpp

проверял через 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  


Про оптимизацию тут хорошо расписано.

Тролли используют этот код:

{ if (a < b) return a; return b; }


Вместо этого:

return a < b ? a : b;


Не просто так.

Цитата
#

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  


Цитата(igor_bogomolov @ 27.1.2010, 16:50) *
В domax лишнее создание переменной.
Можно просто написать return a>b ? a : b;, тогда компилятор сгенерирует идентичный код. По крайней мере вывод objdamp -d для обоих функций одинаков.

Да действительно один в один
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.1.2010, 18:48
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(gigabyte @ 27.1.2010, 20:12) *
Чем они лучше чем простой int max = a>b ? a : b
для меня компактностью записи и наглядностью
int max = qMax(a, b )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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 . Или это совсем отрицательно сказывается на производительности ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.4.2020, 10:08