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

 
TarasBY:

Можно ещё таким способом оптмизировать вычисления:

Спасибо! Мне уже посоветовал использовать bool Avals, a Vinin предупредил, что это серьёзно затормозит. А ведь я после уже почти законченного советника ищу, что бы ещё оптимизировать в коде. Уже добился прогон в тестере на всех тиках за 12 месяцев сократить с 40 минут до 13-ти!
 

Уж сколько раз говорено : сокращенной проверки в МКЛ нет, в случае if(a||b||c||d||e){} будут проверятся все условия.

выход - вложенность условий :

if(a){if(b){if(c){}}} в этом случае выход из проверки произойдет при первом подходящем условии

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

bool cond[]={a,b,c,d,e,...};
int sz = ArraySize(cond);
for(int i=0;i<sz;i++){
   if(cond[i]){
      bla.bla.bla;
      break;
   }
}
 
Vinin: Можно, только скорость работы сильно падает
Виктор, твои предостережения (об использовании bool-пременной) на мои варианты оптимизации распространяются?!
 
FAQ:

Уж сколько раз говорено : сокращенной проверки в МКЛ нет, в случае if(a||b||c||d||e){} будут проверятся все условия.

выход - вложенность условий :

if(a){if(b){if(c){}}} в этом случае выход из проверки произойдет при первом подходящем условии

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

 

Спасибо большое! Буду пробовать! А Вы знаете испанский? Ведь "bla, bla, bla" происходит от глагола "говорить" (hablar)!
 
нет, зато хорошо знаю олбанский :))
 
FAQ:
нет, зато хорошо знаю олбанский :))

Вложенность условий if(a){if(b){if(c){}}} не годится, т.к. все условия взаимоисключающиеся, а вот с булем что-то не выходит. Наверно и скорее всего что-то не то делаю. Пока остановился на том, что на каждое условие сделал переменную double, и вставил в то же if() c 4-мя "или". Как и ожидал, на скорости проходки в тестере не отразилось. Те же 13 минут на всех тиках за 12 месяцев.

А может, этот язык называется обланский? Благодарю и Вас за помощь!

 
borilunad:

Вложенность условий if(a){if(b){if(c){}}} не годится, т.к. все условия взаимоисключающиеся, а вот с булем что-то не выходит. Наверно и скорее всего что-то не то делаю.


Все годится, просто надо вспомнить некоторые тождества из булевой арифметики, например: a || b = !( !a && !b ). Тогда, перейдя от конъюнкции к дизъюнкции, имеем возможность заменить проверку условия "ИЛИ" последовательной (вложенной) проверкой условий "И" : например, if (a || b || c)  превращается, как справледливо написал выше TarasBY, в

bool M = true;

if(!a) {if(!b) {if(!c) M=false;}}

if(!M) {Action;}

Этот код в общем случае быстрее, чем исходный с ||, т.к. исполняется только до тех пор, пока одно из условий в списке не окажется истинным , то есть пока вся операция ИЛИ не даст результат ТРУ.

 
alsu:

Все годится, просто надо вспомнить некоторые тождества из булевой арифметики, например: a || b = !( !a && !b ). Тогда, перейдя от конъюнкции к дизъюнкции, имеем возможность заменить проверку условия "ИЛИ" последовательной (вложенной) проверкой условий "И" : например, if (a || b || c)  превращается, как справледливо написал выше TarasBY, в

Этот код в общем случае быстрее, чем исходный с ||, т.к. исполняется только до тех пор, пока одно из условий в списке не окажется истинным , то есть пока вся операция ИЛИ не даст результат ТРУ.

Можно ускорить и еще, например, если мы знаем, что условие A выполняется в среднем чаще, чем С, а С чаще, чем В, то расположить их надо именно в таком порядке: if(!a){if(!c)if{(!b) M=false;}}
 
alsu:

Все годится, просто надо вспомнить некоторые тождества из булевой арифметики, например: a || b = !( !a && !b ). Тогда, перейдя от конъюнкции к дизъюнкции, имеем возможность заменить проверку условия "ИЛИ" последовательной (вложенной) проверкой условий "И" : например, if (a || b || c)  превращается, как справледливо написал выше TarasBY, в

Этот код в общем случае быстрее, чем исходный с ||, т.к. исполняется только до тех пор, пока одно из условий в списке не окажется истинным , то есть пока вся операция ИЛИ не даст результат ТРУ.

Спасибо за участие! Имею 5 различных, но равных по значению условий, и если никакое не выполняется, то советник ждёт, пока выполнится одно из них. Поэтому ни одна форма реализации пока не оказалась лучше работающей, несмотря на моё старание. Потому пока остаюсь с моими "пирогами".
 
borilunad:
Спасибо за участие! Имею 5 различных, но равных по значению условий, и если никакое не выполняется, то советник ждёт, пока выполнится одно из них. Поэтому ни одна форма реализации пока не оказалась лучше работающей, несмотря на моё старание. Потому пока остаюсь с моими "пирогами".
Даже то, что только что я показал? Ну, тогда быстродействие надо улучшать за счет чего-то другого.
Причина обращения: