Возможно ли избегнуть много "или" (||) в условиях, вызывающих одно и то же действие? - страница 6

 
Meat:

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

Значит, даже взаимоисключающие условия лучше с if(A || B || C || D) Action;

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

Буду продолжать эксперименты, может что выкопаю. Но на спрэд управы нет! :)

 
Вообще самый быстрый вариант будет такой:
bool result;
if (A) result=true;
else
if (B) result=true;
else
if (C) result=true;
else
if (D) result=true;
else result=false;

if (result) Action();


Впрочем, строчку else result=false лучше совместить с первой строчкой, на скорости это практически не отразится. Да и вообще, если A, B, C и D содержат простые условия (с минимумом арифметических действий, без вызова всяких математических функций и прочих прибамбасов), то особого выигрыша в производительности ты не получишь от такой оптимизации (если конечно эта конструкция у тебя выполняется не десятки миллионов раз). А вот загромождение кода может быть существенным.

Я уже писал по этому поводу в одной из веток, что ко всему надо подходить рационально.  Мне почему-то кажется, что у тебя в коде полно более важных мест, оптимизация которых действительно дала бы колоссальный выигрыш в производительности.  Начать нужно с основного алгоритма. У большинства новичков происходят тупая проверка на каждом тике всех условий, касающиеся ТС или открытых ордеров. Отсюда и тормоза.  Хотя в большинстве случаев достаточно проверять лишь граничные условия, например достижение хаем и лоем определённого значения, либо появление нового бара. И лишь после этого выполнять дальнейшие проверки. 

Ну и кроме того, при ресурсоёмких вычислениях нужно задуматься о переносе этих вычислений в DLL. А то сидеть и ждать по 13 минут на грёбанном MQL4 (хотя можно получить тот же результат за 2-3 минуты) как-то ущербно :)

 
Meat:
Вообще самый быстрый вариант будет такой:

Впрочем, строчку else result=false лучше совместить с первой строчкой, на скорости это практически не отразится. Да и вообще, если A, B, C и D содержат простые условия (с минимумом арифметических действий, без вызова всяких математических функций и прочих прибамбасов), то особого выигрыша в производительности ты не получишь от такой оптимизации (если конечно эта конструкция у тебя выполняется не десятки миллионов раз). А вот загромождение кода может быть существенным.

Я уже писал по этому поводу в одной из веток, что ко всему надо подходить рационально.  Мне почему-то кажется, что у тебя в коде полно более важных мест, оптимизация которых действительно дала бы колоссальный выигрыш в производительности.  Начать нужно с основного алгоритма. У большинства новичков происходят тупая проверка на каждом тике всех условий, касающиеся ТС или открытых ордеров. Отсюда и тормоза.  Хотя в большинстве случаев достаточно проверять лишь граничные условия, например достижение хаем и лоем определённого значения, либо появление нового бара. И лишь после этого выполнять дальнейшие проверки. 

Ну и кроме того, при ресурсоёмких вычислениях нужно задуматься о переносе этих вычислений в DLL. А то сидеть и ждать по 13 минут на грёбанном MQL4 (хотя можно получить тот же результат за 2-3 минуты) как-то ущербно :)

Самый быстрый вариант предложтл Paco
 
tara:
Самый быстрый вариант предложтл Paco

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

Кроме того, тот вариант требует вычисления ВСЕХ условий заранее. Так о какой быстроте вообще может быть речь. Это самый медленный вариант.

 
а switch - case не судьба использовать?
 

если нужно ускорение, то можно попобовать побитовые операции.

Т.е. все переменные сделать типа int (false=0). Затем побитово A|B|C...>0 

 
Avals:

если нужно ускорение, то можно попобовать побитовые операции.

Т.е. все переменные сделать типа int (false=0). Затем побитово A|B|C...>0 

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

И никто не проверит предложенные варианты на скорость выполнения?

За основу можно взять скрипт отсюда

 
Meat:
Вообще самый быстрый вариант будет такой:

Впрочем, строчку else result=false лучше совместить с первой строчкой, на скорости это практически не отразится. Да и вообще, если A, B, C и D содержат простые условия (с минимумом арифметических действий, без вызова всяких математических функций и прочих прибамбасов), то особого выигрыша в производительности ты не получишь от такой оптимизации (если конечно эта конструкция у тебя выполняется не десятки миллионов раз). А вот загромождение кода может быть существенным.

Я уже писал по этому поводу в одной из веток, что ко всему надо подходить рационально.  Мне почему-то кажется, что у тебя в коде полно более важных мест, оптимизация которых действительно дала бы колоссальный выигрыш в производительности.  Начать нужно с основного алгоритма. У большинства новичков происходят тупая проверка на каждом тике всех условий, касающиеся ТС или открытых ордеров. Отсюда и тормоза.  Хотя в большинстве случаев достаточно проверять лишь граничные условия, например достижение хаем и лоем определённого значения, либо появление нового бара. И лишь после этого выполнять дальнейшие проверки. 

Ну и кроме того, при ресурсоёмких вычислениях нужно задуматься о переносе этих вычислений в DLL. А то сидеть и ждать по 13 минут на грёбанном MQL4 (хотя можно получить тот же результат за 2-3 минуты) как-то ущербно :)

if (A) Action();
 else
  if (B) Action();
   else
    if (C) Action();
     else
      if (D) Action();

Так еще быстрее. 

Вспомнил байку:

"На заседании правления компании было 2 вопроса:

 1. Решение о строительстве синхрофазотрона.

 2. Решение о строительстве велопарковки для сотрудников.

 По первому вопросу обсуждение длилось 1-ну минуту,

 по 2-му прения продолжались более 2-х часов." 

 
кому не нравится "гребанный MQL4", тот может и пойдет отсюда бегом, бегом. Потому что непонятно что он здесь делает. несмотря на все заслуги и древность аккаунта.
Причина обращения: