5 / 4 / 1
Регистрация: 29.12.2014
Сообщений: 165
1

Ускорение кода

14.10.2019, 17:15. Показов 2022. Ответов 9
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  while (true)
 {
// будем считать что это какой то цикл который будет выполняться до определенного условия. Условия выхода в примере не будет 
    If (i==1)
     {
      // что то делаем тут 
     }
  else If (i==2)
     {
      // что то делаем тут 
     }
  If ((i<10)&&(i>5))
     {
      // что то делаем тут 
     }
  If (i==3)
     {
      // что то делаем тут 
     }
i++;
  }
Собственно согласно такой логике мы выполняем проход цикла и сверяем каждое условие, но мы замечаем что на промежутке 5-10 проверять каждое условие не нужно и следовательно почему бы не сделать так ?
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
  while (true)
 {
// будем считать что это какой то цикл который будет выполняться до определенного условия. Условия выхода в примере не будет 
    If (i==1)
     {
      // что то делаем тут 
     }
  else If (i==2)
     {
      // что то делаем тут 
     }
  If ((i<10)&&(i>5))
     {
              while((i<10)&&(i>5))
                    {
                            // что то делаем тут 
                             i++;
                     }
     }
  If (i==3)
     {
      // что то делаем тут 
     }
i++;
  }
Понятно что тесли различие и будет то оно будет не заметно и может убиться той или иной потребностью системы, но чисто в теории такой подход ускоряет работу или нет ? с точки зрения более низких языков и инструкция будет ли какой то прирост. Заранее спасибо. (был добавлен цикл while в условие ) как по мне мы проверяем только не вышли ли мы за пределы цикла а все другие условия игнорируем.
C++
1
2
3
4
5
6
7
8
  If ((i<10)&&(i>5))
     {
              while((i<10)&&(i>5))
                    {
                            // что то делаем тут 
                             i++;
                     }
     }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2019, 17:15
Ответы с готовыми решениями:

Ускорение кода
Ребят помогите ускорить код. Создаётся вектор на 100000001. Далее приходит n пар - начало и конец....

Ускорение кода
Как ускорить код: #include &lt;iostream&gt; using namespace std; int main(){ int n, q, c =...

Многократное ускорение кода[литература]
Здравствуйте, я дилетант в ЯП C++ перешёл на него после достаточно долгого изучения C# с целью...

Ускорение
Здраствуйте, есть код: #include &lt;stdio.h&gt; #define MAX 1000010 long long h; int i, n,...

9
49 / 43 / 21
Регистрация: 17.03.2014
Сообщений: 135
14.10.2019, 17:44 2
Чисто с алгоритмической точки зрения разница будет только в том, что вам не придется в некоторых случаях проходить по лишним if.
В случае, если для вычисления условия внутри if приходится читать значения из БД или вызывать ресурсоемкие функции, это, конечно, скажется, в остальном же это просто экономия на спичках.
P.S.: а еще можно использовать switch вместо if, т.к. switch закончит работу после совпадения значения в case, а вот if-ы будут перебираться все поочередно.
0
фрилансер
3212 / 2409 / 617
Регистрация: 11.10.2019
Сообщений: 7,201
14.10.2019, 17:56 3
не принесёт это всё никакого ускорения, только читаемость кода снизит.

"Тормоза" ещё надо уметь доказать - профилированием, например. И часто оказывается, что тормозит совсем в другом, очень неожиданном месте кода
0
Мозгоправ
1729 / 1023 / 468
Регистрация: 01.10.2018
Сообщений: 2,137
Записей в блоге: 2
14.10.2019, 18:02 4
Leitto, более того, можно ещё сильнее "оптимизнуть":
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
  while (true)
 {
// будем считать что это какой то цикл который будет выполняться до определенного условия. Условия выхода в примере не будет 
    if (i==1)
     {
      // что то делаем тут 
     }
  else if (i==2)
     {
      // что то делаем тут 
     }
//  If ((i<10)&&(i>5))
//     {
              while((i<10)&&(i>5))
                    {
                            // что то делаем тут 
                             i++;
                     }
//     }
  if (i==3)
     {
      // что то делаем тут 
     }
i++;
  }
Однако, на мой взгляд, ваш первый вариант более правильный. Во-первых, он будет более понятен тому, кто будет в дальнейшем модифицировать или просто сопровождать код (вы же не хотите быть зверски убитым коллегой по цеху?). Во-вторых, гонять цикл в цикле, модифицируя переменную цикла (i) в двух местах - не лучшая идея: возможны ошибки и сложности с отрадкой. В-третьих, преждевременная оптимизация - зло (это не я придумал). В-четвёртых, думаю, что оптимизирующий компилятор сделает из вашего кода дикобраза и сравнивать будет особенно нечего. Но это надо смотреть.

Вообще, если вы очень сильно озабочены эффективностью, то (1) пользуйтесь профилировщиком, (2) для всех вариантов исходного кода исследуйте ассемблерный код, полученный при включенной оптимизации, (2а) посчитатйте количество тактов, (2б) проанализируйте промахи по кэшу. Тонкая оптимизация - вопрос достаточно сложный.
0
5 / 4 / 1
Регистрация: 29.12.2014
Сообщений: 165
16.10.2019, 11:40  [ТС] 5
L0M, Это абстрактный код что бы наглядней описать суть вопроса, естественно я понимаю что гонять переменную в одном и том же цикле может привести к ошибкам и трудночитаемости.
kaznachei67, Есть задачи где нужно оперировать микросекундами под windows хотя она не реал тайми система и эта экономия возможно может помочь Алексей1153, Система профилирования в случае описанным ниже тоже нагружает и может не совсем коректно отобразить инфу о времени выполнении.
Я понимаю что с точки зрения алгоритма это может выйграть если есть какие то трудно затратные задачи по времени в if
case не использовал, что бы показать что возможно два условия будут true
0
║XLR8║
1210 / 907 / 270
Регистрация: 25.07.2009
Сообщений: 4,354
Записей в блоге: 5
16.10.2019, 13:59 6
Цитата Сообщение от Leitto Посмотреть сообщение
Это абстрактный код
Давайте тогда уж абстрактную задачу
0
5 / 4 / 1
Регистрация: 29.12.2014
Сообщений: 165
16.10.2019, 19:55  [ТС] 7
outoftime, К чему такие придирки ? я лишь указал на то что люди оптимизируют так )) хотя безусловно в таком виде если бы стояла именно такая задача это было бы нормально
C++
1
2
3
4
5
6
7
8
//  If ((i<10)&&(i>5))
//     {
              while((i<10)&&(i>5))
                    {
                            // что то делаем тут 
                             i++;
                     }
//     }
0
║XLR8║
1210 / 907 / 270
Регистрация: 25.07.2009
Сообщений: 4,354
Записей в блоге: 5
16.10.2019, 21:16 8
Цитата Сообщение от Leitto Посмотреть сообщение
хотя безусловно в таком виде если бы стояла именно такая задача это было бы нормально
Какая задача?
0
1151 / 1076 / 172
Регистрация: 19.02.2010
Сообщений: 3,231
16.10.2019, 22:30 9
Цитата Сообщение от outoftime Посмотреть сообщение
Какая задача?
Ускорение сферического коня кода в вакууме

Цитата Сообщение от Leitto Посмотреть сообщение
и так ситуация мы имеет достаточно большой проект в котором много различных условий
В данном коде (первый листинг в первом посте) всё портит неизвестность диапазона значений переменной i.
Если бы интервал был компилятору заранее известен (например, если бы вместо while был for с явными указаниями начального и конечного значений счётчика цикла i) - то любой нормальный компилятор для подобной (с кучей ифов или кейсов в свитче) тушки цикла сгенерил бы машинный код ВООБЩЕ БЕЗ КОМАНД УСЛОВНЫХ ПЕРЕХОДОВ. А именно - использовал бы таблицу адресов, в которой по смещениям, соответствующим тем или иным значениям переменной i, лежали бы адреса переходов на тела тех или иных if'ов.
0
║XLR8║
1210 / 907 / 270
Регистрация: 25.07.2009
Сообщений: 4,354
Записей в блоге: 5
16.10.2019, 22:45 10
Цитата Сообщение от VTsaregorodtsev Посмотреть сообщение
Ускорение сферического коня кода в вакууме
Без синхрофазотрона модификации рантайма не обойтись.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.10.2019, 22:45

Скорость, касательное ускорение, полное ускорение, нормальное ускорение и радиус кривизны траектории
Движение точки задано координатным способом. Найти траекторию и начертить ее. Кроме того определить...

Найти траекторию движения, скорость, ускорение, нормальное и касательное ускорение точки
Точка движется по плоскости XOY по закону x=x(t), y=y(t)/ В свою очередь плоскость XOY вращается...

Directx 11: недоступны функции Ускорение DirectDraw, Direct3D, Ускорение текстур AGP
Здравствуйте. Вся проблема как я понял в том, что у меня не правильно работает Directx. Я никак не...

Определить траекторию, скорость, полное ускорение, касательное ускорение и радиус кривизны траектории
Движение точки задано уравнением x=x(t) и y=y(t). Определить траекторию, скорость, полное...


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

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

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