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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.74
FiloXSee
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25
#1

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

01.07.2011, 07:48. Просмотров 4545. Ответов 52
Метки нет (Все метки)

Написал статью по оптимизации кода на С++. Ее можно почитать тут:
[ссылка удалена]

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

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

Методы оптимизации - C++
Здравствуйте, прошу помочь,кто может написать программу для решения задачи используя 2 метода ?1)Метод золотого сечения 2)Метод...

Методы оптимизации памяти - C++
Написал статью по оптимизации памяти в программах на С++. Ее можно почитать тут: http://itw66.ru/blog/c_plus_plus/491.html А какие...

Курсовая. Методы оптимизации - C++
http://www.cyberforum.ru/attachments/402404d1400795723 Помогите чем сможете Заранее спасибо

Методы Оптимизации: Метод параллельных касательных - нужен алгоритм - C++
Здравствуйте. Помогите пожалуйста с составлением алгоритма по методу параллельных касательных. Пытался читать литературу, но там алгоритмы...

Просмотр кода после оптимизации компилятора - C++
Здравствуйте! Известно, что компилятор оптимизирует код. А можно ли посмотреть оптимизированный код до того, как он будет переведен в...

Объяснить нюансы оптимизации заданного фрагмента кода - C++
Наткнулся на статью по оптимизации кода на C++http://itw66.ru/blog/c_plus_plus/13.html]ссылка Есть там 10-й пункт: SomeClass* p; -...

Дублирование кода и константные методы - C++
Есть метод method возвращающий ссылку на внутреннее значение объекта. Существует в двух вариантах - константный и обычный. Константная...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
1928 / 1194 / 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
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 15:15     Методы оптимизации кода #18
Цитата Сообщение от FiloXSee Посмотреть сообщение
Да, это разные операции. Вот только программист может организовать код так, чтобы использовать любую из них.
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
FiloXSee
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 15:27  [ТС]     Методы оптимизации кода #19
Цитата Сообщение от diagon Посмотреть сообщение
Мы пробегаем по строке 2 раза, один раз, чтобы вычислить длину.
В моем же коде пробегаем всего 1 раз.
Да, видимо там не очень удачный комментарий. Видимо комментатор там имел в виду, что нужно выносить все сложные вычисления из части условия в раздел объявления переменных, чтобы вычислять верхний предел один раз.

Добавлено через 3 минуты
Цитата Сообщение от voral Посмотреть сообщение
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
Сравнивать можно что угодно. Важно то, как это используется. Понятно что эти строчки не взаимозаменяемые. Но всегда можно реорганизовать код для любой из этих форм записи. Вопрос в том, какую форму в каких случаях лучше использовать.
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
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];
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.07.2011, 15:58     Методы оптимизации кода #21
24.
C++
1
2
3
int a, b;
1. int x = (a >= b ? 1 : 0);
2. int x = (a >= b ? -1 : 0);
Можно заменить на:
C++
1
2
1. int x = (b - a) >> 31;
2. int x = (b - a) & 0x80000000;
Ну первое ладно, плодим непереносимый код, ну и фиг с ним. А второе-то с какого фига? Там в дополнительном коде никак -1 не получается. Впрочем, и в первом случае получится не 1
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 16:11     Методы оптимизации кода #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
А второе-то с какого фига? Там в дополнительном коде никак -1 не получается.
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........

Вот веселуха будет такой код в команде сопровождать.... А потом кто то решит сменить int на long и вся оптимизация встанет новым раком
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.07.2011, 16:13     Методы оптимизации кода #23
Цитата Сообщение от voral Посмотреть сообщение
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 16:19     Методы оптимизации кода #24
Провел эксперимент
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define NN 125000
int main()
{
    int a=3, b=4,j;
    long c, cc=0;
    
    for (j=0;j<NN;++j)
    {
        c=clock();
        int x = (a >= b ? -1 : 0);
        cc+=c;
    }
    printf("%ld\n",cc/NN);
    cc=0;
    for (j=0;j<NN;++j)
    {
        c=clock();
          int x = (b - a) & 0x80000000;
        cc+=c;
    }
    printf("%ld\n",cc/NN);
    
}
1.Человекопонятное условие
2. "Оптимизация"
Bash
1
2
11729
54723
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.07.2011, 16:27     Методы оптимизации кода #25
voral, не, ну "сенсации" нам тоже не нужны. Это неправильный бенч
Поменяй тесты местами, а результат останется таким же.
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 16:36     Методы оптимизации кода #26
брр.... не понял. И в чем фишка?

Добавлено через 34 секунды
а блин....

Добавлено через 4 минуты
Тогда так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#define NN 100000000
int main()
{
    int a=4, b=3,j;
    long c, cc=0;
    int x;
    
    c=clock();
    for (j=0;j<NN;++j)
        x = (a >= b ? -1 : 0);
    cc+=(clock() - c);
    printf("%ld\n",cc);
    cc=0;
    c=clock();
    for (j=0;j<NN;++j)
          x = (b - a) & 0x80000000;
    cc+=(clock() - c);
    printf("%ld\n",cc);
}
Обратите внимание сколько итераций. Но результат прежний. "Оптимизированный" код тормознее
300000
390000
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 16:39     Методы оптимизации кода #27
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        int x = (a >= b ? -1 : 0);
0111146C  mov         eax,dword ptr [a] 
0111146F  xor         ecx,ecx 
01111471  cmp         eax,dword ptr [b] 
01111474  setl        cl   
01111477  sub         ecx,1 
0111147A  mov         dword ptr [x],ecx 
   
  
    
    
        
          int y = (b - a) & 0x80000000;
0111147D  mov         eax,dword ptr [b] 
01111480  sub         eax,dword ptr [a] 
01111483  and         eax,80000000h 
01111488  mov         dword ptr [y],eax
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 16:41     Методы оптимизации кода #28
Цитата Сообщение от grizlik78 Посмотреть сообщение
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
Ответы верны дает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int a=5, b=3,j;
 
    int i1 = (a >= b ? -1 : 0);
    printf("%d\n",i1);
    int i2 = (b - a) & 0x80000000;
    printf("%d\n",i1);
 
    a=3; b=5;
    i1 = (a >= b ? -1 : 0);
    printf("%d\n",i1);
    i2 = (b - a) & 0x80000000;
    printf("%d\n",i1);
 
    return;
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
01.07.2011, 16:47     Методы оптимизации кода #29
voral, ещё бы ты хоть раз i2 вывел, было бы совсем замечательно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 16:57     Методы оптимизации кода
Еще ссылки по теме:

Влияние оптимизации? Или UB? - C++
Добрый день, подскажите, вроде действия одинаковы, но программа выводит разный результат. Разбираюсь с указателями, пример условный,...

Дайте совет по оптимизации - C++
Необходимо оптимизировать реализацию морского боя. Изначально поле представлял в виде символьного массива, естественно длинной 10х10 ...

MinGW и странности оптимизации - C++
Долго бился, почему банальная строка for(;isLButtonDown();){} не работает как надо, а уходит на бесконечный цикл. (на всякий случай....

Документация по флагам оптимизации - C++
Подскажите мануал, документацию, гайд по флагам оптимизации. Желательно на русском. А то у меня программа весело себя ведёт. ...

Задача по методам оптимизации - C++
Всем доброго времени суток! Необходимо запрограммировать метод тяжелого шарика. Заранее спасибо!


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

Или воспользуйтесь поиском по форуму:
voral
428 / 408 / 57
Регистрация: 16.03.2008
Сообщений: 2,023
01.07.2011, 16:57     Методы оптимизации кода #30
Да "твою дивизию"...... Все надо срочно отдыхать.... Пятница...
Спасибо, что подсказал, а то у меня уже крышу чуть не снесло. Твое объяснение понял, но результаты теста меня сбили....
Yandex
Объявления
01.07.2011, 16:57     Методы оптимизации кода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru