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

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

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

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

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

 Комментарий модератора 
Ссылки на сторонние ресурсы у нас и так не приветствуются, а уж битые и подавно...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2011, 07:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Методы оптимизации кода (C++):

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

Методы оптимизации памяти
Написал статью по оптимизации памяти в программах на С++. Ее можно почитать...

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

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

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

Объяснить нюансы оптимизации заданного фрагмента кода
Наткнулся на статью по оптимизации кода на...

52
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
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
0
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
01.07.2011, 16:11 #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
А второе-то с какого фига? Там в дополнительном коде никак -1 не получается.
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........

Вот веселуха будет такой код в команде сопровождать.... А потом кто то решит сменить int на long и вся оптимизация встанет новым раком
1
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 16:13 #23
Цитата Сообщение от voral Посмотреть сообщение
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
0
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
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
1
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 16:27 #25
voral, не, ну "сенсации" нам тоже не нужны. Это неправильный бенч
Поменяй тесты местами, а результат останется таким же.
0
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
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
1
pito211
186 / 173 / 18
Регистрация: 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
1
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
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;
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 16:47 #29
voral, ещё бы ты хоть раз i2 вывел, было бы совсем замечательно
1
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
01.07.2011, 16:57 #30
Да "твою дивизию"...... Все надо срочно отдыхать.... Пятница...
Спасибо, что подсказал, а то у меня уже крышу чуть не снесло. Твое объяснение понял, но результаты теста меня сбили....
0
ValeryLaptev
Эксперт С++
1049 / 828 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
01.07.2011, 17:32 #31
pito211, еще надо указать с какими ключами компилятора все транслировалось. На каком уровне опимизации
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 17:48 #32
/Od .
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 17:51 #33
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
0
pito211
186 / 173 / 18
Регистрация: 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
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
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.
Так что арифметического сдвига никто не обещал. Как и логического, впрочем.
0
voral
852 / 561 / 115
Регистрация: 16.03.2008
Сообщений: 2,578
01.07.2011, 18:09 #36
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
Вы под линуксом?
Подскажите как увидеть вот в таком формате то что получилось полсе компиляции - вчера gdb мучал, что то видно не нашел.....
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 18:15 #37
В таком формате не знаю (т.е. в gdb могу посмотреть), но GCC может не удалять ассемблерный файл, если использовать ключ --save-temps
Ну а если адреса нужны, то сейчас погляжу. Кажись objdump умел ещё дизассемблировать.

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

Так что арифметического сдвига никто не обещал. Как и логического, впрочем.
возьму на заметку, а как gcc реагирует на такую конструкцию?
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
01.07.2011, 18:21 #39
Цитата Сообщение от pito211 Посмотреть сообщение
возьму на заметку, а как gcc реагирует на такую конструкцию?
Арифметически Я думаю имелись в виду возможности процессора. Не все (учитывая МК) умеют арифметический сдвиг. Но всё-равно явно никто ничего не обещал.
0
pito211
186 / 173 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 18:23 #40
извиняюсь заранее за тупой вопрос, что значит абревиатура МК?
0
01.07.2011, 18:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 18:23
Привет! Вот еще темы с решениями:

Функция считывания данных из файла: прошу совет по оптимизации кода
Код работает, но изящным его назвать очень тяжело. Прошу советов по сокращению...

Мешает ли разделение кода на объявление (.h) и определение (.cpp) inline оптимизации?
Читал что когда включают хедер но не реализацию в единицу трансляции, это...

Рекомендации по оптимизации/ускорению кода и памяти, разбор ключей, профилирование приложений в VS и не только
Вечер добрый форум, у меня на данный момент VS2010. Я так понимаю настройки...

Дублирование кода и константные методы
Есть метод method возвращающий ссылку на внутреннее значение объекта....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

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