Форум программистов, компьютерный форум CyberForum.ru

Методы оптимизации кода - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.74
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 07:48     Методы оптимизации кода #1
Написал статью по оптимизации кода на С++. Ее можно почитать тут:
[ссылка удалена]

А вы какие еще способы оптимизации кода знаете? (я не говорю про оптимизацию алгоритмов. Речь идет про код вообще)

 Комментарий модератора 
Ссылки на сторонние ресурсы у нас и так не приветствуются, а уж битые и подавно...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2011, 07:48     Методы оптимизации кода
Посмотрите здесь:

подскажите по оптимизации кода C++
C++ Методы оптимизации памяти
C++ Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
C++ Создать класс Triad (тройка чисел) - определить методы; определить производный класс Date - переопределить методы
C++ Методы Оптимизации: Метод параллельных касательных - нужен алгоритм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HeRo!N
11 / 11 / 1
Регистрация: 01.10.2010
Сообщений: 139
01.07.2011, 08:10     Методы оптимизации кода #2
Ошибка: 404

К сожалению, такой страницы не существует. Вероятно, она была удалена с сервера, либо ее здесь никогда не было.
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 08:20  [ТС]     Методы оптимизации кода #3
Прошу прощения, вот исправленная ссылка:
http://itw66.ru/blog/c_plus_plus/13.html
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.07.2011, 10:00     Методы оптимизации кода #4
Статья выглядит как СООБРАЖЕНИЯ программиста. Надо бы привести замеры времени.
Maxim Prishchepa
Эксперт С++
 Аватар для Maxim Prishchepa
1875 / 987 / 61
Регистрация: 29.03.2010
Сообщений: 2,983
01.07.2011, 10:38     Методы оптимизации кода #5
Полностью соглашусь с ValeryLaptev, примеры реальной работы в студию, как на огромных так и на не очень больших массивах и т.д. и т.п.
dr.curse
 Аватар для dr.curse
386 / 342 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
01.07.2011, 10:49     Методы оптимизации кода #6
C++
1
some1 = some3 * 1 / a;
а это выражение разве не эквивалентно этому?
C++
1
some1 = some3 / a;
и мне кажется что второе выполняется быстрее.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.07.2011, 11:13     Методы оптимизации кода #7
Допустим есть.
C++
1
2
3
const int a = 100;
some1 = some3 * 1 / a;
some2 = some4 * 1 / a;
более эффективно написать не:
C++
1
2
3
const int a_inv = 1 / a;
some1 = some3 * a_inv;
some2 = some4 * a_inv;
а так:
C++
1
2
some1 = some3 * (1 / a);
some2 = some4 * (1 / a);
Ужас какой. Вместо последних двух строчек смело можно было написать
C++
1
2
some1 = 0;
some2 = 0;
Вот уж что наверняка будет эффективнее

Добавлено через 1 минуту
Да и во втором случае то же самое.
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 11:24  [ТС]     Методы оптимизации кода #8
Цитата Сообщение от aram_gyumri Посмотреть сообщение
C++
1
some1 = some3 * 1 / a;
а это выражение разве не эквивалентно этому?
C++
1
some1 = some3 / a;
и мне кажется что второе выполняется быстрее.
Нет, не быстрее.

1: some1 = some3 * (1.0f / a) - в рантайме будет только умножение. деление будет делать компилятор
2: some1 = some3 / a - будет деление в рантайме. Оно медленнее умножения.
3: some1 = some3 * 1.0f / a - это то же самое что и предыдущее

вариант 1 наиболее эффективный. А заменять на a_inv не нужно, чтобы не портить читаемость кода.

Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
Ужас какой. Вместо последних двух строчек смело можно было написать
C++
1
2
some1 = 0;
some2 = 0;
Вот уж что наверняка будет эффективнее

Добавлено через 1 минуту
Да и во втором случае то же самое.
да, ошибся. Исправил на вещественные числа.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.07.2011, 11:25     Методы оптимизации кода #9
int i;
...
x = array[ i++ ]; - более эффективно, чем
x = array[ ++i ];
сдесь дело не в эффективности, по вашему лучше допустить сознательную ошибку в программе взяв предыдущий элемент массива вместо следуещего только потому что так эффективно? что ж удачной вам отлаки

В первом случае процессор может одновременно (без ожидания сложения) начать складывать и получать значение по адресу в массиве, а во втором случае он это будет делать последовательно.
на то были и придуманы термины префикс и постфикс - для удобства программистам

if( a || b) - нужно первым ставить более вероятное собятие, для большей эффективности
if( func1() && func2() ) - нужно ставить более быстрый оператор первым
аналогично и сдесь дело не в эффективности, а в приоритете, при операции || в случае истинности 1-го операнда, 2-й просто напросто не вычисляется, а при операции && в случае ложности 1-го операнда, 2-й тоже не вычисляется, но это не вычисляется != эффективно

int a[ 1000 ];
for( int i =0; i<1000; ++i )
a[ i ] = 50;

Значительно эффективнее будет:
int* p = a;
for( int i =0; i<1000; ++i, ++p )
*p = 50;
с чего бы это?

float f = 1.0f;
*(int*)&f ^= 0x80000000; - быстрее чем
f *= -1.0f;
а тут так вообще без пол-литры не разберёшся
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
01.07.2011, 11:45     Методы оптимизации кода #10
12
C
1
2
3
u32 a; f32 b;
b = (f32)(i32)a; - быстрее
b = (f32)a;
А это что ещё за магия?

Добавлено через 17 минут
В общем в этой статье нет главного, что нередко пишут в хороших книгах.
Заниматься оптимизацией стоит только тогда, когда это действительно необходимо. Ранняя "оптимизация" нередко приводит к "пессимизации" кода. Кроме того, приведённые в статье трюки могут привести к ускорению (а могут и не привести) только для конкретного процессора и конкретного компилятора. Стоит сменить то или другое, как плюсы могут неожиданно превратиться в минусы. Ну и, как уже было замечено, без реальных цифр это всё-равно ни о чём. Хотя как заметка "что ещё можно попробовать, когда ничего не помогает", может и сгодится.
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 11:48  [ТС]     Методы оптимизации кода #11
Цитата Сообщение от Maxwe11 Посмотреть сообщение
сдесь дело не в эффективности, по вашему лучше допустить сознательную ошибку в программе взяв предыдущий элемент массива вместо следуещего только потому что так эффективно? что ж удачной вам отлаки
Да, это разные операции. Вот только программист может организовать код так, чтобы использовать любую из них.

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

Допустим идет разработка системы частиц (particle system). Каждая частица будет апдейтиться в каждом кадре. Если частиц 10000 то любая лишняя операция будет сказываться на производительности. А если добавить несколько if то можно вообще ее убить.

Цитата Сообщение от Maxwe11 Посмотреть сообщение
аналогично и сдесь дело не в эффективности, а в приоритете, при операции || в случае истинности 1-го операнда, 2-й просто напросто не вычисляется, а при операции && в случае ложности 1-го операнда, 2-й тоже не вычисляется, но это не вычисляется != эффективно
В данной статье под эффективностью понимается скорость выполнения. Согласись - более эффективный тот вариант, который делает меньше действий для получения результата. Значительно эффективнее код, который может не делать бесполезные действия. А самое главное, что от того как программист расположит операторы в if выражении будет зависеть скорость работы кода. Именно поэтому нужно думать, когда в if помещаешь функции. Может эта функция будет к серверу обращаться впустую только из за того, что программист поленился поставить первым оператором выражение, которое всегда вернет false.

Цитата Сообщение от Maxwe11 Посмотреть сообщение
с чего бы это?
Инкремент указателя быстрее, чем его вычисление по произвольному смещению. Именно это будет при a[x].
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.07.2011, 14:26     Методы оптимизации кода #12
FiloXSee, если бы вы привели ассемблерный код в обоих случаях, то все увидели бы, что НА САМОМ ДЕЛЕ эффективно.
А пока, повторюсь, статья выглядит просто как соображения программиста. Что ОЧЕНЬ ЧАСТО не соответствует действительности.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.07.2011, 14:28     Методы оптимизации кода #13
Еще одной хорошей практикой является следующее:

Пусть у нас есть цикл


C++
1
2
3
for ( int i = 0; i < strlen( string ); ++i )
{
}

у нас на каждой итерации цикла вычисляется длина строки. Это плохо (за исключением когда строка в теле цикла меняется — но его мы рассматривать не будем). Лучше написать следующим образом:


C++
1
2
3
for ( int i = 0, size = strlen( string ); i < size; ++i )
{
}

И вообще — когда условие терминации цикла не меняется в ходе самого цикла (а в ином случае лучше использовать while) следует проводить предварительный расчет.
В данном случае можно сделать в 2 раза быстрее.
C++
1
2
3
for (int i = 0; str[i]; ++i)
{
}
Цитата Сообщение от pito211 Посмотреть сообщение
?????
См. #3
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 14:30     Методы оптимизации кода #14
Ошибка: 404

К сожалению, такой страницы не существует. Вероятно, она была удалена с сервера, либо ее здесь никогда не было.

Вернуться назад, перейти на главную
?????
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 14:53  [ТС]     Методы оптимизации кода #15
Цитата Сообщение от diagon Посмотреть сообщение
В данном случае можно сделать в 2 раза быстрее.
C++
1
2
3
for (int i = 0; str[i]; ++i)
{
}
Спасибо за первый нормальный ответ.
Хотя это не ускорит код. Основное время тратится не на вычисление, а на условие. Его проверка остается даже в этом случае.

Более того, вариант for ( int i = 0, size = strlen( string ); i < size; ++i ) будет сравнивать две целые стековые переменные, а вариант for (int i = 0; str[i]; ++i) будет вычислять текущий указатель, разыменовывать его получая по нему данные, брать от них только 1 байт и только потом сравнивать его с нулем. Это будет дольше, чем просто сравнение.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
01.07.2011, 15:01     Методы оптимизации кода #16
Цитата Сообщение от FiloXSee Посмотреть сообщение
Спасибо за первый нормальный ответ.
Хотя это не ускорит код. Основное время тратится не на вычисление, а на условие. Его проверка остается даже в этом случае.

Более того, вариант for ( int i = 0, size = strlen( string ); i < size; ++i ) будет сравнивать две целые стековые переменные, а вариант for (int i = 0; str[i]; ++i) будет вычислять текущий указатель, разыменовывать его получая по нему данные, брать от них только 1 байт и только потом сравнивать его с нулем. Это будет дольше, чем просто сравнение.
Вы забываете о том, как работает strlen
Примерная реализация
C++
1
2
3
4
5
unsigned strlen(char * str){
    unsigned res = 0;
    while (*str++) ++res;
    return res;
}
Т.е. в этом коде
C++
1
for ( int i = 0, size = strlen( string ); i < size; ++i )
Мы пробегаем по строке 2 раза, один раз, чтобы вычислить длину.
В моем же коде пробегаем всего 1 раз.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.07.2011, 15:01     Методы оптимизации кода #17
Цитата Сообщение от FiloXSee Посмотреть сообщение
Спасибо за первый нормальный ответ.
Хотя это не ускорит код. Основное время тратится не на вычисление, а на условие. Его проверка остается даже в этом случае.

Более того, вариант for ( int i = 0, size = strlen( string ); i < size; ++i ) будет сравнивать две целые стековые переменные, а вариант for (int i = 0; str[i]; ++i) будет вычислять текущий указатель, разыменовывать его получая по нему данные, брать от них только 1 байт и только потом сравнивать его с нулем. Это будет дольше, чем просто сравнение.
Это опять-таки только ВАШИ соображения. Покажите ассемблерный текст для обоих вариантов.
voral
346 / 326 / 46
Регистрация: 16.03.2008
Сообщений: 1,698
01.07.2011, 15:15     Методы оптимизации кода #18
Цитата Сообщение от FiloXSee Посмотреть сообщение
Да, это разные операции. Вот только программист может организовать код так, чтобы использовать любую из них.
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
FiloXSee
18 / 9 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 15:27  [ТС]     Методы оптимизации кода #19
Цитата Сообщение от diagon Посмотреть сообщение
Мы пробегаем по строке 2 раза, один раз, чтобы вычислить длину.
В моем же коде пробегаем всего 1 раз.
Да, видимо там не очень удачный комментарий. Видимо комментатор там имел в виду, что нужно выносить все сложные вычисления из части условия в раздел объявления переменных, чтобы вычислять верхний предел один раз.

Добавлено через 3 минуты
Цитата Сообщение от voral Посмотреть сообщение
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
Сравнивать можно что угодно. Важно то, как это используется. Понятно что эти строчки не взаимозаменяемые. Но всегда можно реорганизовать код для любой из этих форм записи. Вопрос в том, какую форму в каких случаях лучше использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 15:34     Методы оптимизации кода
Еще ссылки по теме:

C++ Курсовая. Методы оптимизации
C++ Дублирование кода и константные методы
Методы оптимизации C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
voral
346 / 326 / 46
Регистрация: 16.03.2008
Сообщений: 1,698
01.07.2011, 15:34     Методы оптимизации кода #20
Просто тогда явно не хватает сравнения что лучше
C
1
x=array[i++]
или
C
1
2
x=array[i];
++i;
и отдельно
C
1
x=array[++i]
или
C
1
2
++i;
 x=array[i];
Yandex
Объявления
01.07.2011, 15:34     Методы оптимизации кода
Ответ Создать тему
Опции темы

Текущее время: 15:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru