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

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

03.07.2014, 12:19. Показов 4060. Ответов 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
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
10.07.2014, 19:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Dinkin Посмотреть сообщение
а у XE?
ХЕ нет, по этому уверенно ничего сказать не могу. Мы в свое время купили обновление с 6 на что-то, что там было после 6? посмотрели, и математику перенесли на ms.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.07.2014, 07:40
Цитата Сообщение от Dinkin Посмотреть сообщение
К примеру, речь о том, что цикл for, быстрее работает, если в нем статичные переменные.
То есть этот код должен работать быстрее
C
1
2
3
AnsiString st;
int h = st.Length();
for(int i=0;i<h;i++)
чем этот?
C
1
2
AnsiString st;
for(int i=0;i<st.Length();i++)
аргументируя это тем, что каждый цикл в for, снова пересчитывает длину строки.
Такое вполне может быть, если в теле цикла находится вызов внешней функции, к которой у
компилятора нет доступа, тогда он будет обязан вставить вычисление Length() внутрь цикла,
чтобы не было побочных эффектов (например, когда st неявным образом изменяется из этой
внешней функции). В остальных случаях компилятор легко соптимизирует такой цикл.

Цитата Сообщение от Dinkin Посмотреть сообщение
Следующий вариант, это рекомендация использовать связку if else, чем if if
Это преждевременная оптимизация.
Над такими элементарными случаями лучше вообще не ломать голову, компилятор
все равно сделает по-своему.

Вообще, - и об этом пишут много где и постоянно, - нельзя доверять своим "чувствам" в
отношении того, что и где будет быстрее, а что медленнее. Все нужно проверять ручками, в
профилировщиках и других соответствующих программах. И только после того, как найдутся
узкие места, производительность которых не устраивает, следует заниматься оптимизацией.
В противном случае это тупое прожигание времени.

И даже если кто-то пишет, что (a>b) будет быстрее (b<a), это все равно нужно проверить
двадцать пять раз, прежде чем поверить. Я буквально вчера оптимизировал один спинлок,
про который писали, что он работает заметно шустрее критической секции. По тестам
оказалось ровно обратное.
4
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
11.07.2014, 10:32  [ТС]
также есть утверждения что программа работает быстрее с переменными что об явлены внутри функции, чем глобально....так же сделал замеры, разницы не нашел..только если рассуждать логически...ведь глобальную переменную раз объявил и она весит в программе, а внутри функции каждый раз при выполнении создается, это же довес к "напрягу" программы ? Я не говорю что глобальная переменная это хорошо,все зависит от поставленной задачи. Просто собираю нюансы в свою "копилку".
0
1 / 1 / 1
Регистрация: 14.03.2014
Сообщений: 46
11.07.2014, 10:45
Наглядней будет, если сделать это, а после еще и дизассемблировать код, чтобы посмотреть количество операций. Потому что, я предполагаю что разницы нет, обратишься ли ты к локальной переменной или глобальной (в плане производительности). И вот, предполагаю что, если замеры одинаковы, значит и число операций одинаковое в обоих случаях на выходе компилятора.
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
14.07.2014, 15:22  [ТС]
Еще вот натолкнулся, что система быстрее отрабатывает такой код на порядок быстрее

C
1
2
3
4
AnsiString a,b;
a = "sqwer";
b = "apostol";
 if(strcmp(a.c_str(),b.c_str()));

Чем если сравнивать просто

C
1
2
3
4
AnsiString a,b;
a = "sqwer";
b = "apostol";
if(a==b) ;
Добавлено через 6 минут
ошибся в последней строчке кода,там так должно быть
C
1
if(a!=b) ;
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.07.2014, 16:03
Цитата Сообщение от Dinkin Посмотреть сообщение
Чем если сравнивать просто
Да получится отличный г-код, да и сомнительно что отрабатывать будет быстрее.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
14.07.2014, 16:07  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Да получится отличный г-код, да и сомнительно что отрабатывать будет быстрее.
Можно объяснить, просто делал тест с 100 тыщ строчек и прирост с "strcmp" более чем на секунду....просто может есть определенные случаи когда его можно юзать,а когда нет?
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
21.07.2014, 23:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
да и сомнительно что отрабатывать будет быстрее.
Нашел время, тестануть и действительно быстрее он не отрабатывает если сравнивать так

C
1
if(a.c_str()==b.c_str())
тоесть нет необходимости впихивать strcmp
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.07.2014, 23:58
Я просто оставлю это здесь:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
 
int main()
{
    using namespace std;
 
    string a = "Hello";
    string b = "Hello";
    
    cout << (a.c_str() == b.c_str()) << endl;
 
    return 0;
}
> false
http://codepad.org/eF31b4U1
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.07.2014, 00:00
Цитата Сообщение от Dinkin Посмотреть сообщение
if(a.c_str()==b.c_str())
А что ты тут хотел сравнить ? указатели ?

Не по теме:

Убежденный, Тут о UnicodeString речь, хотя смысл тот же.



C++
1
2
3
4
String a= "Hello!";
String b= a;
 
ShowMessage( BoolToStr(a.c_str()==b.c_str(),true)); // True !!!
1
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,184
Записей в блоге: 3
22.07.2014, 00:50  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А что ты тут хотел сравнить ? указатели ?
нет, хотел значения сравнить, но видимо сравнил указатели
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2014, 00:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
51
Ответ Создать тему
Новые блоги и статьи
Копировать 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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru