Ошибки, баги, вопросы - страница 2588

 
Igor Makanu:

могу вопрос поставить как проверить варианты №1 и №2 по скорости, высока вероятность, что компилятор оптимизирует исполняемый код и тесты будут не корректными - поэтому и спрашиваю

Прогнать обычный тест отдельно для 1 и 2 и сравнить время? )

Если время ничтожно мало, прогнать одинаковую оптимизацию с вариантом 1 и вариантом 2.

 
Igor Makanu:

ЗЫ: могу вопрос поставить как проверить варианты №1 и №2 по скорости, высока вероятность, что компилятор оптимизирует исполняемый код и тесты будут не корректными - поэтому и спрашиваю

https://www.mql5.com/ru/code/18804

TesterBenchmark
TesterBenchmark
  • www.mql5.com
При написании разных версий кода может возникнуть необходимость измерения влияния их на общую производительность советника в тестере. Это позволяет не только понять, насколько оптимален написанный код по сравнению с другим, но и дает предпосылки к будущей быстрой оптимизации советника. Такой подход позволяет выявить "бутылочное горлышко" в...
 
Igor Makanu:

занялся опять оптимизацией, не уверен, что сумею протестировать на скорость выполнения такой код:

подозреваю, что вариант №2 будет быстрее работать?

если да, где могут быть "подводные камни" - использую в OnTick() - для поиска в оптимизаторе времени торговли, ищу способы оптимизировать код


ЗЫ: могу вопрос поставить как проверить варианты №1 и №2 по скорости, высока вероятность, что компилятор оптимизирует исполняемый код и тесты будут не корректными - поэтому и спрашиваю

В дебаг режиме проверяй. Там компилятор по идее не должен оптимизировать, хотя ХЗ, как там на самом деле.
 

Вопрос по ArrayResize. Делаю сразу Reserve на несколько гигабайтов. И постепенно увеличиваю Size, который меньше исходного Reserve.

По какой причине TaskManager показывает увеличение потребления памяти во время увеличения Size?

 
fxsaber:

Вопрос по ArrayResize. Делаю сразу Reserve на несколько гигабайтов. И постепенно увеличиваю Size, который меньше исходного Reserve.

По какой причине TaskManager показывает увеличение потребления памяти во время увеличения Size?

Потому что, кроме metatrader, есть еще ОС Windows, которая в конечном итоге и решает, кому из нескольки десятков процессов  (кстати, у каждого из них, по умолчанию, адрессное пространство 4 ГБ), реально (сколько у Вам там?) оперативки выделять.
 
Andrey Khatimlianskii:

Прогнать обычный тест отдельно для 1 и 2 и сравнить время? )

Если время ничтожно мало, прогнать одинаковую оптимизацию с вариантом 1 и вариантом 2.

что то делаю не так, все равно не смог увидеть отличий, результаты плавают при одиночном прогоне в районе 0.1 сек 

 
fxsaber:

Вопрос по ArrayResize. Делаю сразу Reserve на несколько гигабайтов. И постепенно увеличиваю Size, который меньше исходного Reserve.

По какой причине TaskManager показывает увеличение потребления памяти во время увеличения Size?

Специально, мы ничего для этого не предпринимаем - это особенность ОС (а действительно ли пользователю нужны гигабайты?

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


Но, из MQL, доступа к зарезервированному участку массива нет.

 
Ilyas:

Специально, мы ничего для этого не предпринимаем - это особенность ОС (а действительно ли пользователю нужны гигабайты?

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


Но, из MQL, доступа к зарезервированному участку массива нет.

Спасибо. Интересно, как должно сказываться на производительности, если делать сразу полноценный ArrayResize на гигабайты.

 
void OnStart()
{  datetime m_stoptime = 0;
//1.
   if(m_stoptime < TimeCurrent())
   {
      //расчеты   
   }


//2.
   MqlTick last_tick;
   if(SymbolInfoTick(_Symbol, last_tick))
   {  if(m_stoptime < last_tick.time) 
      {
         //расчеты
      }
   }
//3. 
      const int start = 0;
      const int count = 1;
      datetime time[1];
      if(CopyTime(_Symbol,PERIOD_M1,start,count,time)>0)
      {
        if(m_stoptime < time[0]) 
         {
         //расчеты
         }
      }
}

протестировал, запустил полный перебор при оптимизации своего советника на 5000 проходов, посчитал просто по логу тестера

1. 14:04:28.365  - 14:15:47.481 = 11 м 19 сек

2. 13:49:56.885 - 14:00:30.819 = 10 м 34 сек

3. 14:28:35.89 - 14:41:11.659 = 12 м 36 сек


в принципе как и ожидал вариант №2 быстрее, на 5000 проходов выигрыш около 30 секунд,тоже довольно не плохо

 

Прошу помочь вызвать это меню через WinAPI.

Строку с выбранным именем советника получить получается. Там в ComboBox она всего одна, в отличие от MT4.

А вот вызвать меню - не выходит. BM_CLICK не помогает.


ЗЫ Чем отслеживаете Messages в x64?


Решил задачу через WM_LBUTTONDOWN.