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

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

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

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

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

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

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

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

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

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

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

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

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

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

52
diagon
Higher
1930 / 1196 / 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 раз.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 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 байт и только потом сравнивать его с нулем. Это будет дольше, чем просто сравнение.
Это опять-таки только ВАШИ соображения. Покажите ассемблерный текст для обоих вариантов.
1
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
01.07.2011, 15:15 #18
Цитата Сообщение от FiloXSee Посмотреть сообщение
Да, это разные операции. Вот только программист может организовать код так, чтобы использовать любую из них.
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
0
FiloXSee
19 / 10 / 0
Регистрация: 01.07.2011
Сообщений: 25
01.07.2011, 15:27  [ТС] #19
Цитата Сообщение от diagon Посмотреть сообщение
Мы пробегаем по строке 2 раза, один раз, чтобы вычислить длину.
В моем же коде пробегаем всего 1 раз.
Да, видимо там не очень удачный комментарий. Видимо комментатор там имел в виду, что нужно выносить все сложные вычисления из части условия в раздел объявления переменных, чтобы вычислять верхний предел один раз.

Добавлено через 3 минуты
Цитата Сообщение от voral Посмотреть сообщение
Две этих строки (с постфиксом и префиксом) сравнивать совершенно не корректно, т.к. они не взаимозаменяемы.
Сравнивать можно что угодно. Важно то, как это используется. Понятно что эти строчки не взаимозаменяемые. Но всегда можно реорганизовать код для любой из этих форм записи. Вопрос в том, какую форму в каких случаях лучше использовать.
0
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
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];
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
01.07.2011, 16:11 #22
Цитата Сообщение от grizlik78 Посмотреть сообщение
А второе-то с какого фига? Там в дополнительном коде никак -1 не получается.
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........

Вот веселуха будет такой код в команде сопровождать.... А потом кто то решит сменить int на long и вся оптимизация встанет новым раком
1
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.07.2011, 16:13 #23
Цитата Сообщение от voral Посмотреть сообщение
Ну по чему же. "Как" получится.
Если int 4 байта. Во всех остальных случаях будет 0........
Если int 4 байта, то получится -2147483648. А в первом случае как-раз -1, а не 1.
0
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
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
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.07.2011, 16:27 #25
voral, не, ну "сенсации" нам тоже не нужны. Это неправильный бенч
Поменяй тесты местами, а результат останется таким же.
0
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
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 / 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
1
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
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
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
01.07.2011, 16:47 #29
voral, ещё бы ты хоть раз i2 вывел, было бы совсем замечательно
1
voral
463 / 444 / 73
Регистрация: 16.03.2008
Сообщений: 2,154
01.07.2011, 16:57 #30
Да "твою дивизию"...... Все надо срочно отдыхать.... Пятница...
Спасибо, что подсказал, а то у меня уже крышу чуть не снесло. Твое объяснение понял, но результаты теста меня сбили....
0
01.07.2011, 16:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2011, 16:57
Привет! Вот еще темы с ответами:

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

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

Методы защиты данных от записи во время выполнения участка кода? - C++
День добрый, форумчане. Вводные данные: - Весь свой код строю на работе с указателями. - Потоки пока не использую - Linux, gcc...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы - C++
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы Abiturient:...


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

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

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