Немного про Comment

 

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

Можете проверить сами. Вот такой скрипт будет работать примерно 50!!! секунд (тестировал на разных машинах).

int start()
{
    int i;
    Alert("Начали");
    for (i=0; i<10000; i++)    Comment(i);
    Alert("Завершено");
    return(0);
}

То есть вызов  Comment в таком простом виде занимает - 0,005 сек. 
Но обычно нам необходимо оптимизировать не 10000 баров, а 100000 и прогонов такого цикла может быть не один, а несколько. Простым расчетом видно, что если общее количество вызова функции Comment будет [100000 баров*10 итераций*0,005 сек], то в результате время на обработку затянет аж на 83!!!! минуты.
Конечно, как же после этого не ругать MQL за низкую скорость вычислений!

Поэтому рекомендую убирать Comment из длинных циклов или ограничить его вызов в рамках тех временных потерь, которые вы готовы понести (например, каждую сотую итерацию или по проценту). Ускорение ГАРАНТИРОВАНО!


 
По этой же причине нужно избавляться и от ненужных Print-ов. Comment только на экран выводится (значит должен работать достаточно быстро), а Print - это запись в файл журнала. И хотя кеширование дисков конечно спасает, но... пользоваться ими можно/нужно при отладке, а в готовых кодах - оставить минимум: только самое-самое необходимые.
 

Давайте проверим скорость публично, добавив простой способ учета через GetTickСount() и запустив скрипт:

int start()
  {
   int i;
   int ticks=GetTickCount();
//----
   Alert("Начали");
   for (i=0; i<10000; i++)    Comment(i);
   Alert("Завершено за ",GetTickCount()-ticks," ms");
//----
   return(0);
  }

Запустил на своем AMD 4800+ и получил результат:

2008.06.19 15:17:17 Test EURUSD,M1: Alert: Завершено за 110 ms
2008.06.19 15:17:17 Test EURUSD,M1: Alert: Начали


То есть, цикл в 10 000 итераций занял 110 миллисекунд, а не 50 секунд. Грубо говоря, каждый вызов Comment занял 110 мс / 10 000 = 0.011 мс или 0.000011 секунды, что в 454 раза отличается от 0.005 секунды.

Запустил цикл на 10 000 000 итераций и получил время в 55 секунд, что дает время выполнения каждой итерации в 0.0000055 секунды. Так как время выполнения (55 сек вместо 0.11 сек) больше, то точность вычисления времени на одну итерацию гораздо точнее.

Можете проверить сами.

Вот и проверили.

 

Кроме того, в режиме оптимизатора функция Comment() полностью отключается(пропускается, как и Print), а в режиме тестирования эксперта отключается принудительная перерисовка экрана, что экономит еще очень много времени.


На всякий случай загляните в статью: Особенности и ограничения тестирования торговых стратегий в MetaTrader 4

 

Вот. Запустил ваш приведенный код на Pentium4 2.4Ghz.

Даже хуже чем на Celeron 1.2Ghz

То есть на один Comment приходится 0,013 с (в три раза больше ожидаемой чем на более медленной машине!!!)

Как это???

P.S.

Вообще тема поднята в защиту мкл от тестовиков, которые очень любят вставлять Comment'ы и ругать свои алгоритмы за маленькую скорость исполнения.

 
Просьба к народу, проверьте пожалуйста и выложите такой скриншот и частоту камня.
 
sergeev писал (а) >>

Вот. Запустил ваш приведенный код на Pentium4 2.4Ghz.

Даже хуже чем на Celeron 1.2Ghz

То есть на один Comment приходится 0,013 с (в три раза больше ожидаемой чем на более медленной машине!!!)

Как это???

P.S.

Вообще тема поднята в защиту мкл от тестовиков, которые очень любят вставлять Comment'ы и ругать свои алгоритмы за маленькую скорость исполнения.




19:19:09 2007.01.02 00:00 Ttest EURUSD,M1: Alert: Завершено за 15 ms

у меня стабильно 15-16мс

цп 2.6 ядро одно

---

в тестах - если советник отлажен для скорости при оптимизациях разумно конечно отключать распринтовку и коменты

и тут очень бы помогла условная компиляция которой увы нет в MQL4

и я так понимаю что увы ее не включат в MQL5


пока приходится лазить по тексту и вырубать

 
Зачем вообще в цикле нужен коммент? У кого-то так быстро работает глаз и мысль, чтобы уследить что в внего выводится? Ни по практическим ни по теоретическим соображениям ему нечего там делать (комменту в цикле).
 

Ну никак не получается больше 100-200 миллисекунд на 10 000 выводов Comment. И так пробовал и этак...


sergeev, возьмите указанный мною код, поместите его в скрипт (именно в скрипт, а не эксперта), однократно бросьте на график, а потом опубликуйте результат.

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

Вот такие результаты:

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

Если же ничего не трогать и просто смотреть, то на глаз видно как меняются циферки в Comment.
В 3-м разряде цифра меняется прибл. каждые 0.5 сек., а в 4 и 5 разрядах мельтишит незаметно для глаза.

--

Это был ЭКСПЕРТ. Машинка слабая: 1.0 Ггц, памяти ок 500Мб.

Причина обращения: