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

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

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

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

А может, так попробовать:

    bool M = false;

    if (A) M = true; else if (B) M = true; else if (C) M = true; else if (D) M = true; else if (E) M = true;
    if (M == true) Action;

 Спасибо!

 
alsu:

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

Я уже давно их в таком порядке расположил. Но если даже вдруг выполнится больше одного условия, тогда выполнится первое попавшееся.

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

 
alsu:

Еще сильнее можно ускорить, комбинируя вероятность выполенния условия с его вычислительной сложностью: например, взяв за критерий произведение вероятности выполнения на величину, обратную времени вычисления, первыми следует проверять те условия, которые наиболее вероятны и имеют наименьшую вычислитеьлную сложность, т.е. те, которые имеют наибольшее значение заданного нами критерия.
Алексей, ещё раз отвечаю на Ваше предложение поменять местами условия в зависимости от их влияния на скорость исполнения действий. И вот, что я обнаружил! Самые сложные вычисления не тормозят так, как функции, проверяющие различные необходимые данные рынка и открытых позиций на каждый тик. Эти функции я уже достаточно упростил по совету одного из форумчан, выкинув все ненужности в моём случае, что ускорило их действие почти вдвое. Насчёт выбора работы на "каждом" тике, ещё раньше убедился, что только этот режим даёт большее приближение к реально возможным результатам. Так вот, поставив эти функции после всех вычислений, проверок индикаторов и текущей цены, скорость увеличилась ещё вдвое, что составляет сейчас 7 минут прогона в тестере за полгода и, соответственно, 14 минут за год. Отказаться от функций не могу, выполняющие необходимые проверки, если предыдущие условия позволяют. Теперь буду пробовать оптимизировать код, меняя && на ) if (. Рад буду узнать, какие есть ещё возможности в оптимизации кодов. Спасибо Вам и всем за помощь!
 
borilunad:

Ни один из операторов не подходит. Может, есть какой-нибудь другой способ без if(A || B || C || D || E) Action;?

Прошу модераторов не отправлять в общую ветку вопрошающих ввиду важности вопроса, над которым думаю и не могу найти более рационального решения! Спасибо!


if(A || B || C || D || E) Action;    я бы так сделал   if((A + B + C + D + E) > 0) Action;   если для Action нужно минимум 3 сигнала, вместо 0 пишем 2

скорость, я не замерял 

 
pako:


if(A || B || C || D || E) Action;    я бы так сделал   if((A + B + C + D + E) > 0) Action;   если для Action нужно минимум 3 сигнала, вместо 0 пишем 2

скорость, я не замерял 


Ускорение будет колоссальное. Решение очень оригинальное
 
Если A,B,C,D  - функции , то нужно считать по сложности начиная с самой легкой и постоянно проверять на истинность. Так будет работать быстрее.
 
Vinin:

Ускорение будет колоссальное. Решение очень оригинальное
Только вошёл! Cпасибо, Pako! Спасибо, Виктор! Сейчас пообедаю и попробую!
 
FION:
Если A,B,C,D  - функции , то нужно считать по сложности начиная с самой легкой и постоянно проверять на истинность. Так будет работать быстрее.

Благодарю Вас за участие! А, В, С ... не функции, а условия, содержащие функции и не содержащие их, и к тому же взаимоисключающие! И достаточно одного условия, чтобы перейти к другим условиям, которые уже вызывают действие. Если бы были только функции, тогда бы не было проблемы:

double А = function1(); double B = function2(); double C = function3(); double D = function4(); double E = function5(); и далее, как предложил Pako:

if((A + B + C + D + E) > 0)

{другие условие с зеркально различающимися по направлению для закрытия Байев или Сэллов} Action; НО:

А мне нужно, чтобы А = условие1, В = условие2, С = условие3, D = условие4, Е = условие5. Возможно или нет?! Или это невозможно и всё тут!

Например:

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo);

 Что пробовать-делать не знаю!

 

 
borilunad:

А мне нужно, чтобы А = условие1, В = условие2, С = условие3, D = условие4, Е = условие5. Возможно или нет?! Или это невозможно и всё тут!

bool a = true;

//или
double a;

а = (isCloseLastPosByTake() == True && Profit > ProClo / clo - GetProfitCloseLastPosByTake() * clo); <---   10,444 = 8,087 > 3,908 эт на каком языке? 

 

bool a = false;

if (isCloseLastPosByTake() == True && Profit > ProClo / (clo - GetProfitCloseLastPosByTake() * clo)) a = true;
Причина обращения: