Форум программистов, компьютерный форум 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++ Методы Оптимизации: Метод параллельных касательных - нужен алгоритм
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
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
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
01.07.2011, 16:11     Методы оптимизации кода #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
А второе-то с какого фига? Там в дополнительном коде никак -1 не получается.
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........

Вот веселуха будет такой код в команде сопровождать.... А потом кто то решит сменить int на long и вся оптимизация встанет новым раком
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 16:13     Методы оптимизации кода #23
Цитата Сообщение от voral Посмотреть сообщение
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
voral
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
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
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 16:27     Методы оптимизации кода #25
voral, не, ну "сенсации" нам тоже не нужны. Это неправильный бенч
Поменяй тесты местами, а результат останется таким же.
voral
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
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
 Аватар для 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
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
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
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 16:47     Методы оптимизации кода #29
voral, ещё бы ты хоть раз i2 вывел, было бы совсем замечательно
voral
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
01.07.2011, 16:57     Методы оптимизации кода #30
Да "твою дивизию"...... Все надо срочно отдыхать.... Пятница...
Спасибо, что подсказал, а то у меня уже крышу чуть не снесло. Твое объяснение понял, но результаты теста меня сбили....
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
01.07.2011, 17:32     Методы оптимизации кода #31
pito211, еще надо указать с какими ключами компилятора все транслировалось. На каком уровне опимизации
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 17:48     Методы оптимизации кода #32
/Od .
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 17:51     Методы оптимизации кода #33
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 17:57     Методы оптимизации кода #34
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
    x = (a >= b ? -1 : 0);
002C14D0  mov         eax,dword ptr [a] 
002C14D3  xor         ecx,ecx 
002C14D5  cmp         eax,dword ptr [b] 
002C14D8  setl        cl   
002C14DB  sub         ecx,1 
002C14DE  mov         dword ptr [x],ecx 
    y = (b - a) >> 31;
002C14E1  mov         eax,dword ptr [b] 
002C14E4  sub         eax,dword ptr [a] 
002C14E7  sar         eax,1Fh 
002C14EA  mov         dword ptr [y],eax
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 18:00     Методы оптимизации кода #35
А вот, кстати, цитата из стандарта C++ по поводу сдвига вправо (п.5.8.3)
The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a
signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 divided
by the quantity 2 raised to the power E2. If E1 has a signed type and a negative value, the resulting value
is implementation-defined.
Так что арифметического сдвига никто не обещал. Как и логического, впрочем.
voral
344 / 324 / 46
Регистрация: 16.03.2008
Сообщений: 1,692
01.07.2011, 18:09     Методы оптимизации кода #36
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
Вы под линуксом?
Подскажите как увидеть вот в таком формате то что получилось полсе компиляции - вчера gdb мучал, что то видно не нашел.....
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 18:15     Методы оптимизации кода #37
В таком формате не знаю (т.е. в gdb могу посмотреть), но GCC может не удалять ассемблерный файл, если использовать ключ --save-temps
Ну а если адреса нужны, то сейчас погляжу. Кажись objdump умел ещё дизассемблировать.

Добавлено через 1 минуту
Bash
1
objdump -d a.out
Добавлено через 2 минуты
В gdb
Код
disassemble main
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 18:19     Методы оптимизации кода #38
Цитата Сообщение от grizlik78 Посмотреть сообщение
А вот, кстати, цитата из стандарта C++ по поводу сдвига вправо (п.5.8.3)

Так что арифметического сдвига никто не обещал. Как и логического, впрочем.
возьму на заметку, а как gcc реагирует на такую конструкцию?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
01.07.2011, 18:21     Методы оптимизации кода #39
Цитата Сообщение от pito211 Посмотреть сообщение
возьму на заметку, а как gcc реагирует на такую конструкцию?
Арифметически Я думаю имелись в виду возможности процессора. Не все (учитывая МК) умеют арифметический сдвиг. Но всё-равно явно никто ничего не обещал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 18:23     Методы оптимизации кода
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 18:23     Методы оптимизации кода #40
извиняюсь заранее за тупой вопрос, что значит абревиатура МК?
Yandex
Объявления
01.07.2011, 18:23     Методы оптимизации кода
Ответ Создать тему
Опции темы

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