Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/43: Рейтинг темы: голосов - 43, средняя оценка - 4.63
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25

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

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

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

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

 Комментарий модератора 
Ссылки на сторонние ресурсы у нас и так не приветствуются, а уж битые и подавно...
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2011, 07:48
Ответы с готовыми решениями:

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

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

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

52
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 15:58
Студворк — интернет-сервис помощи студентам
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
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 16:11
Цитата Сообщение от grizlik78 Посмотреть сообщение
А второе-то с какого фига? Там в дополнительном коде никак -1 не получается.
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........

Вот веселуха будет такой код в команде сопровождать.... А потом кто то решит сменить int на long и вся оптимизация встанет новым раком
1
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 16:13
Цитата Сообщение от voral Посмотреть сообщение
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 16:19
Провел эксперимент
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
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 16:27
voral, не, ну "сенсации" нам тоже не нужны. Это неправильный бенч
Поменяй тесты местами, а результат останется таким же.
0
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 16:36
брр.... не понял. И в чем фишка?

Добавлено через 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
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 16:39
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
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 16:41
Цитата Сообщение от 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
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 16:47
voral, ещё бы ты хоть раз i2 вывел, было бы совсем замечательно
1
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 16:57
Да "твою дивизию"...... Все надо срочно отдыхать.... Пятница...
Спасибо, что подсказал, а то у меня уже крышу чуть не снесло. Твое объяснение понял, но результаты теста меня сбили....
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
01.07.2011, 17:32
pito211, еще надо указать с какими ключами компилятора все транслировалось. На каком уровне опимизации
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 17:48
/Od .
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 17:51
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 17:57
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
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 18:00
А вот, кстати, цитата из стандарта 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
3061 / 1465 / 265
Регистрация: 16.03.2008
Сообщений: 6,512
Записей в блоге: 2
01.07.2011, 18:09
Цитата Сообщение от grizlik78 Посмотреть сообщение
У меня GCC примерно то же самое выдал с -O3 (с другими не пробовал) попутно разбавив код установкой регистров esi, edi и eax (перед вызовом printf).
Но что толку их сравнивать, если они разный результат дают...
Вы под линуксом?
Подскажите как увидеть вот в таком формате то что получилось полсе компиляции - вчера gdb мучал, что то видно не нашел.....
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 18:15
В таком формате не знаю (т.е. в gdb могу посмотреть), но GCC может не удалять ассемблерный файл, если использовать ключ --save-temps
Ну а если адреса нужны, то сейчас погляжу. Кажись objdump умел ещё дизассемблировать.

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

Так что арифметического сдвига никто не обещал. Как и логического, впрочем.
возьму на заметку, а как gcc реагирует на такую конструкцию?
0
Эксперт С++
 Аватар для grizlik78
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
01.07.2011, 18:21
Цитата Сообщение от pito211 Посмотреть сообщение
возьму на заметку, а как gcc реагирует на такую конструкцию?
Арифметически Я думаю имелись в виду возможности процессора. Не все (учитывая МК) умеют арифметический сдвиг. Но всё-равно явно никто ничего не обещал.
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
01.07.2011, 18:23
извиняюсь заранее за тупой вопрос, что значит абревиатура МК?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2011, 18:23

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru