Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3

Теория оптимизации

03.07.2014, 12:19. Показов 4064. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго! В интернете натолкнулся на статью бывалого прогера, который говорит несколько простых правил оптимизации кода Си. Делал опыты по некоторым его советам в XE 3….и что то результаты тестов не совпадают с его высказыванием.

К примеру, речь о том, что цикл for, быстрее работает, если в нем статичные переменные.
То есть этот код должен работать быстрее

C
1
2
3
AnsiString st;
int h = st.Length();
for(int i=0;i<h;i++)
чем этот? аргументируя это тем, что каждый цикл в for, снова пересчитывает длину строки.
C
1
2
AnsiString st;
for(int i=0;i<st.Length();i++)

Следующий вариант, это рекомендация использовать связку if else, чем if if

то есть этот код работать должен быстрее
C
1
2
3
4
5
6
7
8
if(a==0)
  {
     b=10000000;
  }
    else
      {
         2=10000000;
      }
Чем этот

C
1
2
3
4
5
6
7
8
if(a==0)
  {
     b=10000000;
  }
if(a==1)
  {
     b=20000000;
  }
но по факту замеры показали обратное....хотелось бы услышать мнение бывалых,а так же по возможности примеры любых простых оптимизаций, с которыми в процессе кодинга Вы сталкивались

Добавлено через 8 минут
опечатался в коде, второго примера, там "b=20000000;" заместо "2=10000000;"
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2014, 12:19
Ответы с готовыми решениями:

Метод оптимизации
Здравствуйте. Помогите перевести программу из консоли в форму, пожалуйста. Еще мне нужно на графике изобразить переход точек,которые...

Вопрос оптимизации программы
Программу сообрал, но как показывает практика, она после некоторой стабильной работты начинает пожирать системные ресурсы Вопрос как...

Интересный пример оптимизации
Привет! Копаясь в OpenJDK наткнулся на довольно интересный подход (оптимизацию). Решил поделиться, кому-то может быть полезно в плане...

50
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
03.07.2014, 16:47  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от BRcr Посмотреть сообщение
Вот результат в релизе:
ну ваще...это что получается..оптимизацией нужно отдельно заниматься только в режиме релиза ..и судя по тестам луче использовать "i++"
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 16:59
Цитата Сообщение от Dinkin Посмотреть сообщение
и судя по тестам луче использовать "i++"
Нет, судя по ним самым, преинкремент( ++i ) работает быстрее, как ему и положено.
Цитата Сообщение от Dinkin Посмотреть сообщение
это что получается..оптимизацией нужно отдельно заниматься только в режиме релиза
Оптимизацией нужно заниматься в режиме проектирования и написания кода. Но смотреть свои результаты - действительно лучше в релизе.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
03.07.2014, 17:05  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Нет, судя по ним самым, преинкремент( ++i ) работает быстрее, как ему и положено.
Да, я просто перепутал скрины...спасибо большое за тесты.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2014, 17:12
BRcr, Не позорься, погугли разницу между ++i и i++, ну или проверь сколько итераций в каждом цикле выполняется.
2
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 17:48
Цитата Сообщение от Avazart Посмотреть сообщение
погугли разницу между ++i и i++
Ммм...? А что тут позорного? Провел пару тестов - выложил результаты. Зато не голословно и без отсылов к великому гуглу.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 17:53
Ну, да, не совсем корректно провел. Но на то это и форум - все вольны поправлять и дополнять друг-друга.
По количеству итераций - это да, еще одна ошибка закралась.
Правильно вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    mcrs::t_time_counter tc;
    String postinc_time, preinc_time;
 
    tc.start( );
    for ( int i( 0 ), ii, i_limit( INT_MAX ); i < i_limit; i++)
    {
        ii = i;
    }
    tc.stop( );
    postinc_time = tc.get_time_string( );
 
    tc.start( );
    for ( int i( 0 ), ii, i_limit( INT_MAX ); i < i_limit; ++i)
    {
        ii = i;
    }
    tc.stop( );
    preinc_time = tc.get_time_string( );
 
    ShowMessage( "i++ time = " + postinc_time + "\n++i time = " + preinc_time );
Миниатюры
Теория оптимизации  
2
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.07.2014, 18:14
Ну 31мс думаю можно списать на погрешность.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
03.07.2014, 18:23  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну 31мс думаю можно списать на погрешность.
можно...но вот если раз 10 прогнать и всегда будет такой результат....., мелочь, а приятно
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 18:34
Теперь постараемся нивелировать погрешности и возможные оптимизации:
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
    mcrs::t_time_counter tc;
    unsigned postinc_time( 0 ), preinc_time( 0 ), tests_quantity( 50 );
 
    for ( size_t c( 0 ), c_limit( tests_quantity ); c < c_limit; ++c )
    {
        tc.start( );
        for ( int i( 0 ), ii, i_limit( INT_MAX ); i < i_limit; )
        {
            ii = i++ ;
        }
        tc.stop( );
        postinc_time += tc.full_time;
 
        tc.start( );
        for ( int i( 0 ), ii, i_limit( INT_MAX ); i < i_limit; )
        {
            ii = ++i;
        }
        tc.stop( );
        preinc_time += tc.full_time;
    }
 
    ShowMessage( "postinc_time = " + tc.get_time_string( postinc_time / tests_quantity )
        + "\npreinc_time = " + tc.get_time_string( preinc_time / tests_quantity ) );
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    class t_time_counter
    {
    public:
        DWORD full_time;
        unsigned int hours, mins, secs, msecs;
 
        void __fastcall translate_full_time( )
        {
            hours = ( mins = ( secs = full_time / 1000 ) / 60 ) / 60;
            mins %= 60;
            secs %= 60;
            msecs = full_time % 1000;
        }
 
        void __fastcall start( )
        {
            full_time = GetTickCount( );
        }
 
        void __fastcall stop( )
        {
            full_time = GetTickCount( ) - full_time;
            translate_full_time( );
        }
 
        String __fastcall get_time_string( )
        {
            String s( "h: " + UIntToStr( hours ) + ", m: " + UIntToStr( mins ) + ", s:" + UIntToStr( secs ) + ", ms: " + UIntToStr( msecs ) );
            return s;
        }
 
        String __fastcall get_time_string( unsigned int _full_time )
        {
            full_time = _full_time;
            translate_full_time( );
            return get_time_string( );
        }
    } ;
Миниатюры
Теория оптимизации  
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 18:35
Лучший ответ Сообщение было отмечено Dinkin как решение

Решение

Тест if else.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    mcrs::t_time_counter tc;
    unsigned if_else_time( 0 ), if_if_time( 0 ), if_else_if_time( 0 ), tests_quantity( 5 ), a_init( 2 );
 
    for ( size_t c( 0 ), c_limit( tests_quantity ); c < c_limit; ++c )
    {
        // -----------------------------------------
        tc.start( );
        for ( int i( 0 ), a( a_init ), b, i_limit( INT_MAX ); i < i_limit; ++i )
        {
            if ( a == 0 )
            {
                b = 10000000;
            }
            else
            {
                b = 20000000;
            }
        }
        tc.stop( );
        if_else_time += tc.full_time;
        // -----------------------------------------
        tc.start( );
        for ( int i( 0 ), a( a_init ), b, i_limit( INT_MAX ); i < i_limit; ++i )
        {
            if ( a == 0 )
            {
                b = 10000000;
            }
            if ( a == 1 )
            {
                b = 20000000;
            }
        }
        tc.stop( );
        if_if_time += tc.full_time;
        // -----------------------------------------
        tc.start( );
        for ( int i( 0 ), a( a_init ), b, i_limit( INT_MAX ); i < i_limit; ++i )
        {
            if ( a == 0 )
            {
                b = 10000000;
            }
            else if ( a == 1 )
            {
                b = 20000000;
            }
        }
        tc.stop( );
        if_else_if_time += tc.full_time;
        // -----------------------------------------
    }
    ShowMessage( "if_else_time = " + tc.get_time_string( if_else_time / tests_quantity )
        + "\nif_if_time = " + tc.get_time_string( if_if_time / tests_quantity )
        + "\nif_else_if_time = " + tc.get_time_string( if_else_if_time / tests_quantity ) );
B результаты при различных значениях a_init:
Миниатюры
Теория оптимизации   Теория оптимизации   Теория оптимизации  

1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
03.07.2014, 19:51  [ТС]
Судя из тестов, то высказывания верно, что связка if else работает шустрее
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2014, 20:02
Да нет, как бы if - if победил. Посмотри на секунды, не только на мс.

Надо еще попробовать отключить всю оптимизацию компилятора и так глянуть. Для постинкремента явно что-то делается, возможно, inline-подстановки...
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
03.07.2014, 20:13  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
всю оптимизацию компилятора
А сама оптимизация XE (то что включается в настройках)....ни где не слышал что бы ее вобще кто то включал, она весома? какие с ней плюсы и минусы?
0
1 / 1 / 1
Регистрация: 14.03.2014
Сообщений: 46
10.07.2014, 16:23
По логике условное ветвление if-else должно быть производительней if-if, мол в else не заглянет, если if выполнился. На деле же if-if оказывается быстрее.
Помнится учился я еще в универе и у нас об этом преподаватель упоминал. Где-то он вычитал на микро-мякгом(microsoft'ском) сайте рекомендации по написанию. Они вроде говорили что это связанно с особенностями компилятора.
Жаль не все помню, ссылочку естественно дать не могу. Так, из личного.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
10.07.2014, 16:38  [ТС]
Если вспоминать годы универа..то говорили что цикл while всегда будет быстрее for, но тест показал, что одинаково... (хотя в 4 из 10 замеров for оказался быстрее немного, но я это сослал на погрешность).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2014, 16:45
Цитата Сообщение от Dinkin Посмотреть сообщение
то говорили что цикл while всегда будет быстрее for,
Исходя из каких соображений ?
0
1 / 1 / 1
Регистрация: 14.03.2014
Сообщений: 46
10.07.2014, 16:50
На habrahabr была статья, где сравнивали while и for по производительности. Может еще повезет найти, если интересно. Где-то год назад читал. По тестам for вышел немного вперед лишь потому что его набить на клавиатуре быстрее, чем while. Хотя, по мне, наоборот.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
10.07.2014, 17:38  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Исходя из каких соображений ?
точно не помню, но звучало как то так "у него операндов меньше из за этого и быстрее"
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
10.07.2014, 19:20
Цитата Сообщение от Dinkin Посмотреть сообщение
чем этот? аргументируя это тем, что каждый цикл в for, снова пересчитывает длину строки.
AnsiString - паскалевая строка, она хранит длину и никто ничего на пересчитывает.
Оптимизатор у борланда был чисто символический.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
10.07.2014, 19:43  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
птимизатор у борланда был чисто символический.
а у XE?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2014, 19:43

Научиться искусству оптимизации кода
Доброго вечера. Такой вопрос, может есть у кого свободная минутка и может научить правилу формирования кода, делать код более компактным и...

Отключение оптимизации и векторизации компилятора?
Скажите,возможно ли в XE2 отключить оптимизацию и векторизацию.

Нужен совет в оптимизации кода
Нужно оптимизировать метод Deallocate, который переводит нужный указатель из allotted в exempted, и, если указателя нет, бросает ошибку. Я...

Дайте совет по реорганизации и оптимизации исходника
Здравствуйте, формчане. У Вас здесь я пишу впервые, хотя некоторое время уже следил за жизнью форума и обсуждением его тем. Я не искушен в...

Теория оптимизации запроса
Добрый день! В базе данных две таблицы, таблица пользователей и таблица их сообщений. Есть ли смысл держать id первой и последней...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru