Особенности языка mql5, тонкости и приёмы работы - страница 254

 

MqlDateTime struct и затем вызывать функцию StructToTime.


 
amrali #:

Я изменил название GetMonthTime4 на более описательное:

Альтернатива.

    constexpr inline timestamp_t get_timestamp(
            const uint32_t day,
            const uint32_t month,
            const uint32_t year,
            const uint32_t hour = 0,
            const uint32_t minute = 0,
            const uint32_t second = 0) noexcept {
        long _mon = month - 1;
        const long _TBIAS_YEAR = 1900;
        const long      lmos[] = {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
        const long      mos[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
        long _year = year - _TBIAS_YEAR;
        // для предотвращения проблемы 2038 года переменная должна быть больше 32 бит
        long long _days = (((_year - 1) / 4) + ((((_year) & 03) || ((_year) == 0)) ? mos[_mon] : lmos[_mon])) - 1;
        _days += DAYS_IN_YEAR * _year;
        _days += day;
        const long _TBIAS_DAYS = 25567;
        _days -= _TBIAS_DAYS;
        timestamp_t _secs = SECONDS_IN_HOUR * hour;
        _secs += SECONDS_IN_MINUTE * minute;
        _secs += second;
        _secs += _days * SECONDS_IN_DAY;
        return _secs;
    }
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

Vladislav Boyko, 2024.04.18 02:29

Максимальная оптимизация:

StructToTime() -> 13421 msec
CreateDateTime() -> 125 msec
sum1: 447943668480000000
sum2: 447943668480000000

Нет оптимизации:

StructToTime() -> 12937 msec
CreateDateTime() -> 1860 msec
sum1: 447943668480000000
sum2: 447943668480000000

Производительность импортируемых функций не может зависеть от выбранных настроек компилятора.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

amrali, 2024.04.18 01:50

datetime CreateDateTime(const int iYear, const int iMonth, const int iDay)
  {
// MqlDateTime dt = {iYear, iMonth, iDay}
// return StructToTime(dt);

   static const int dm[] = {0, 0, 31, 59, 90, 120, 151, 181, 212,243, 273, 304, 334};
   int leap_days = (iYear - 1968) / 4 - (iYear % 4 == 0 && iMonth < 3);
   return datetime((iYear - 1970) * 365 + leap_days + dm[iMonth] + iDay - 1) * 86400;
  }

Внесите это слагаемое в массив.

 
Предполагаю, что если массив дней переделать в switch, то будет еще быстрее, т.к. компилятор откажется от проверки корректности индекса массива.
 
fxsaber # : I assume that if the array of days is converted into a switch, it will be even faster, because the compiler will refuse to check the correctness of the array index .

lookup tables are always faster than switch (linear search).

 

Основной проблемой было кодирование компонентов года и месяца в метку времени.

Остальные компоненты структуры MqlDateTime тривиальны для клакуляции. (умножение на секунды)

 
datetime GetMonthTime5( const int Year, const int Month )
{
  static const uint Months[] = {0, 11512676, 11512180, 11511728, 11511232, 11510750, 11510256,
                                   11509774, 11509280, 11508781, 11508302, 11507806, 11507326};

  return(((Year * 5844 - Months[Month]) >> 4) * 86400);
}

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

 
fxsaber #:

Немного улучшенный механизм применения оптимизации позволил получить следующее. Я думаю, что это самый быстрый расчет.

Очень быстро.
 
amrali #:
Очень быстро.

В копилку алгоритмов по теме.

Optimizing UTC → Unix Time Conversion For Size And Speed
  • 2020.05.12
  • blog.reverberate.org
How do you convert a UTC timestamp to Unix Time (seconds since the epoch)? Of course the right answer is “you use a standard library function.” But what if you don’t have one available? Or what if you’re the person implementing that library? Converting the time portion is trivial. Unix Time pretends that leap seconds do not exist and makes...
Причина обращения: