Быстрый TimeHour/TimeMinute? - страница 2

 
Хотя нет, вывод значения в коммент для замеров не дело, график может обновляться только не ниже системного таймера.
Если таймер будет ниже, то начинает виснуть обновление ChartRedraw. 
Ааа, теперь понял вашу причину, связанную с тестером, это фигово что тестер и терминал работают по разному.   
 
для приличия в циклах счетчики минут (часов) поставить нужно, а потом их распечатать. Так компилятору придется реально выполнять весь цикл.  А условие он может вычислить, что оно никогда не выполнимо и проигнорит его, а вместе с ним и весь цикл.
 
Nikolai Semko:
для приличия в циклах счетчики минут (часов) поставить нужно, а потом их распечатать. Так компилятору придется реально выполнять весь цикл.  А условие он может вычислить, что оно никогда не выполнимо и проигнорит его, а вместе с ним и весь цикл.
А еще лучше дело иметь не с циклом с равномерными приращениями, а в начале сгенерировать массив со случайными time, и в цикле перебирать его. Тогда компилятору точно не удасться вывести безцикловую формулу расчета значений. Оптимизация циклов -это любимая работа компилятора.
 

А так, тоже не то?
Значения все взяты из первого поста.

   long past   = 631141200;  //1990
   long future = 1893445200; //2030
   long dif    = future - TimeCurrent(); //Diff 2030 - TimeCurrent
   
   ulong s2 = GetTickCount();
   
   for(long t = past; t <= TimeCurrent()+dif; t+=37)
   {
      if ( TimeHourMy(TimeCurrent()) +  TimeMinuteMy(TimeCurrent()) == 987654 ) 
         break;      
      
   }
   
   ulong s3 = GetTickCount();
   
   ulong s4 = s3-s2;
   Print( "Clock: ", (string)s4, " ms"); 

Несколько запусков

2019.11.15 17:26:13.080 TestScript (EURUSD,M1)  Clock: 515 ms
2019.11.15 17:26:14.913 TestScript (EURUSD,M1)  Clock: 484 ms
2019.11.15 17:26:16.311 TestScript (EURUSD,M1)  Clock: 500 ms
2019.11.15 17:26:17.533 TestScript (EURUSD,M1)  Clock: 500 ms
2019.11.15 17:26:18.736 TestScript (EURUSD,M1)  Clock: 469 ms
2019.11.15 17:26:19.902 TestScript (EURUSD,M1)  Clock: 469 ms
2019.11.15 17:26:21.088 TestScript (EURUSD,M1)  Clock: 484 ms
2019.11.15 17:26:22.336 TestScript (EURUSD,M1)  Clock: 516 ms
 

Ребят, задача не проверить скорость. Это можно сделать в тестере (проверять час и минуту для текущего TimeCurrent() каждую секунду на протяжении года).

Задача — придумать быстрый алгоритм расчета.

 
Andrey Khatimlianskii:

Ребят, задача не проверить скорость. Это можно сделать в тестере (проверять час и минуту для текущего TimeCurrent() каждую секунду на протяжении года).

Задача — придумать быстрый алгоритм расчета.

Так а что можно придумать быстрее этого ))

return( (time % (24 * 3600))/3600 );
 
Хотя как писал Ренат, остаток от деления, дорогая операция.
Наверно надо думать как от него избавится.
 
Andrey Khatimlianskii:
int TimeMinuteMy(datetime time)
{
        return( ((time % (24 * 3600))%3600)/60 );
}


Не усложняйте людям жизнь)

int TimeMinuteMy(datetime time)
  {
   return((time/60) % 60);
  }
 
void OnStart()
  {
   ulong demo=0;
   ulong s1 = GetMicrosecondCount();
   for(datetime t = 0; t<100000000; t += 3)
     {
      demo+=TimeHour(t) +  TimeMinute(t);
     }
   ulong s2 = GetMicrosecondCount();
   for(datetime t = 0; t<100000000; t += 3)
     {
      demo+=TimeHourMy(t) +  TimeMinuteMy(t);
     }
   ulong s3 = GetMicrosecondCount();
   if(demo>0)
     {
      Print("TimeToStruct: ", (s2-s1)/1000.0, " ms, Math: ", (s3-s2)/1000.0, " ms");
     }
  }

int TimeHour(datetime time)
  {
   MqlDateTime tm;
   TimeToStruct(time,tm);
   return(tm.hour);
  }
int TimeMinute(datetime time)
  {
   MqlDateTime tm;
   TimeToStruct(time,tm);
   return(tm.min);
  }

int TimeHourMy(datetime time)
  {
   return((time % (24 * 3600))/3600);
  }
int TimeMinuteMy(datetime time)
  {
   return((time/60) % 60);
  }

С обманкой для компилятора.

 

Под отладкой и без:

2019.11.15 19:00:07.046 Test1 (EURUSD,M1)       TimeToStruct: 673.606 ms, Math: 1710.195 ms
2019.11.15 19:00:15.137 Test1 (EURUSD,M5)       TimeToStruct: 428.756 ms, Math: 126.876 ms
Конечно, тест не очень.... Пускай так будет.