Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать про оптимизацию программного кода. Хотелось бы в виде статьи или отдельного раздела в справке. Такой материал мог бы сильно помочь например в написании экспертов для чемпионата, тем паче, что востребованность есть..
Использование вызова функции
в том месте цикла, где этот вызов считается (подразумевается)
инвариантным - многие прямо в условии цикла лепят проверку с вызовом
функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь
о тормозах на каждой итерации
Поясните, плиз, дотошному. В качестве ликбеза.
В каких ещё местах цикла for() вызовы функций подразумеваются
инвариантными? В каких ещё операторах имеет место быть инвариантность
вызова функций. Ничего про это ранее в Справочнике не встречал.
"Тормоза на каждой итерации" - это время, теряющееся на вычисление
функции, которую можно было посчитать всего один раз перед циклом и закешировать!
А теперь подробнее о инвариантности:
Когда используется цикл, подобный
for (int i = 0; i < TradesTotal(); i++)
{
...
}
Мы принимаем условие в цикле
i < TradesTotal()
инвариантным (неизменным).
Но разве это условие может быть инвариантным? Со всеми выходящими с этим последствиями.
Также инвариантность имеет место быть в цикле с предусловием while, например:
i = 0;
while (i < TradesTotal())
{
i++;
...
}
А вот инвариантность в операторе if (искусственно построенный цикл с постусловием):
i = 0;
while (true)
{
i++;
...
if (i >= TradesTotal())
break;
}
Придумал ещё пример, когда писал пост ниже:
for (i = 0; i < 10; i += function())
{
...
}
или же
i = 0;
while (i < 10)
{
i += function();
...
}
Ещё примеры нужны? :)))
И не важно, что за функция стоит в условии... Мы полагаем условие неизменным на всех итерациях!
Вроде всё разжевал.
p.s.: заранее извиняюсь, что влез...
aharata:
Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать
про оптимизацию программного кода. Хотелось бы в виде статьи или
отдельного раздела в справке. Такой материал мог бы сильно помочь
например в написании экспертов для чемпионата, тем паче, что
востребованность есть..
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными?
Цитирую документацию:
Оператор for состоит из трех выражений и выполняемого оператора:
for(выражение1; выражение2; выражение3) оператор;
Выражение1 описывает
инициализацию цикла. Выражение2 - проверка условия завершения цикла.
Если оно истинно, то выполняется оператор тела цикла for.
Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл
заканчивается и управление передается следующему оператору. ВыражениеЗ
вычисляется после каждой итерации.
Особое внимание обратите на эквивалент оператору for. Выражение1 не входит в цикл (итерации), всё остальное входит. Заметьте, туда входит и оператор! Если в операторе есть функции, которые Мы полагаем также инвариантными, то смысл их считать n-итераций раз?
for (i = 0; i < 3; i++)
{
SL = Ask-StopLoss ()*Point; // тоже инвариантность
TP = Ask+TakeProfit()*Point; // она окружает Нас везде!!
OpenBuy(5.0, Ask, SL, TP);
}
Посмотрите пожалуйста советник 800232. Сдаётся мне, что есть какие-то проблемы с терминалом, так как советник не выполняет заданные операции и в журнале нет никакой информации об ошибках.
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.
Это из области эффективного программирования.
Вообще, инвариант цикла программист должен определять для себя сам. Хороший оптимизатор кода сам находит инвариантные выражения и выносит их за пределы цикла с тем, чтобы вычислить их однократно. Однако никакой оптимизатор не может сказать, насколько инвариантым является вызов той или иной функции.
На самом деле вызов гипотетической функции TradesTotal может и не быть инвариантным - здесь программист решает сам. AccountInfoDouble - точно не инвариантная функция из-за асинхронности, но для упрощения расчётов (если программист - не параноик) необходимо предположить, что она инвариантна и перед первым использованием (которым обязательно должна быть проверка на 0) возвращённое значение необходимо закешировать
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Что-то фильтр кривовато работает:
Использование вызова функции в том месте цикла, где этот вызов считается (подразумевается) инвариантным - многие прямо в условии цикла лепят проверку с вызовом функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь о тормозах на каждой итерации
Поясните, плиз, дотошному. В качестве ликбеза.
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.
"Тормоза на каждой итерации" - это время, теряющееся на вычисление функции, которую можно было посчитать всего один раз перед циклом и закешировать!
А теперь подробнее о инвариантности:
Когда используется цикл, подобный
Мы принимаем условие в цикле
i < TradesTotal()инвариантным (неизменным).
Но разве это условие может быть инвариантным? Со всеми выходящими с этим последствиями.
Также инвариантность имеет место быть в цикле с предусловием while, например:
А вот инвариантность в операторе if (искусственно построенный цикл с постусловием):
Придумал ещё пример, когда писал пост ниже:
или же
Ещё примеры нужны? :)))
И не важно, что за функция стоит в условии... Мы полагаем условие неизменным на всех итерациях!
Вроде всё разжевал.
p.s.: заранее извиняюсь, что влез...
Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать про оптимизацию программного кода. Хотелось бы в виде статьи или отдельного раздела в справке. Такой материал мог бы сильно помочь например в написании экспертов для чемпионата, тем паче, что востребованность есть..
Зачем же? Мы весьма разумный Вид.
Yedelkin:
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными?
Цитирую документацию:
Оператор for состоит из трех выражений и выполняемого оператора:
for(выражение1; выражение2; выражение3)
оператор;
Выражение1 описывает инициализацию цикла. Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.
Оператор for эквивалентен следующей последовательности операторов:
выражение1;
while(выражение2)
{
оператор;
выражение3;
};
Ответ:
Особое внимание обратите на эквивалент оператору for. Выражение1 не входит в цикл (итерации), всё остальное входит. Заметьте, туда входит и оператор! Если в операторе есть функции, которые Мы полагаем также инвариантными, то смысл их считать n-итераций раз?
Теперь надеюсь точно всё...
:DD
Прогнал, я прогнал
Посмотрите пожалуйста советник 800232. Сдаётся мне, что есть какие-то проблемы с терминалом, так как советник не выполняет заданные операции и в журнале нет никакой информации об ошибках.
Поясните, плиз, дотошному. В качестве ликбеза.
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.
Это из области эффективного программирования.
Вообще, инвариант цикла программист должен определять для себя сам. Хороший оптимизатор кода сам находит инвариантные выражения и выносит их за пределы цикла с тем, чтобы вычислить их однократно. Однако никакой оптимизатор не может сказать, насколько инвариантым является вызов той или иной функции.
На самом деле вызов гипотетической функции TradesTotal может и не быть инвариантным - здесь программист решает сам. AccountInfoDouble - точно не инвариантная функция из-за асинхронности, но для упрощения расчётов (если программист - не параноик) необходимо предположить, что она инвариантна и перед первым использованием (которым обязательно должна быть проверка на 0) возвращённое значение необходимо закешировать
Здравствуйте, модератор!
Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY?
Здравствуйте, модератор!
Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY?
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА?