Действительно, ваша версия самая быстрая. Поздравляю!
TimeToStructFast
Это самый быстрый вариант, который я смог найти.
Еще один очень быстрый вариант - использование вычислительного календаря (фиктивного календаря, начинающегося 1 марта), который позволяет избежать проблемы с високосными годами.
Еще один очень быстрый вариант - использование вычислительного календаря (фиктивного календаря, начинающегося 1 марта), который позволяет избежать проблемы с високосными годами.
Этот код выполняется медленно при использовании оберток встроенного StructToTime.
Использование оптимизированных функций здесь очень помогает.
datetime array[];
constint aa = CopyTime(_Symbol, PERIOD_H1, 0, Bars(_Symbol, PERIOD_H1), array);
if(aa<=0)
{
Print("Can't read quotes, error: ", _LastError);
return;
}
constint n = ArraySize(array);
ENUM_DAY_OF_WEEK weekday = -1;
for(int i = 0; i < n; ++i)
{
if(TimeDayOfWeek(array[i]) > MONDAY)
continue;
int hour = TimeHour(array[i]);
//...//...
}
Еще один момент: распаковка (TimeToStruct) всегда быстрее, чем сжатие (StructToTime). Встроенный StructToTime действительно медленнее, чем TimeToStruct().
Если ваш код создает много переменных 'datetime' из компонентов времени, вы обнаружите, что CreateDateTime() намного быстрее, чем MQL'овская StructToTime().
Я столкнулся с проблемой медленной работы StructToTime() при создании переменных времени суток для перехода на летнее время в библиотеке TimeZoneInfo. Заменив ее на эту пользовательскую CreateDateTime(), я значительно улучшил скорость работы.
Добавил его сюда.
Действительно, ваша версия самая быстрая. Поздравляю!
Это самый быстрый вариант, который я смог найти.
Еще один очень быстрый вариант - использование вычислительного календаря (фиктивного календаря, начинающегося 1 марта), который позволяет избежать проблемы с високосными годами.
Это новый алгоритм и очень быстрый. Посмотреть его можно здесь https://www.youtube.com/watch?v=0s9F4QWAl-E&t=1790s.
Источник: https: //searchfox.org/mozilla-central/source/js/src/jsdate.cpp#263
https://github.com/torvalds/linux/blob/276010551664f73b6f1616dde471d6f0d63a73ba/kernel/time/timeconv.c#L77
Высокопроизводительные (по сравнению со встроенными) функции времени, собранные с разных страниц этой темы (чтобы не потерялись):
Я планирую опубликовать его в кодовой базе, возможно, после добавления некоторых других полезных функций.
Это самый быстрый вариант, который я смог найти.
Еще один очень быстрый вариант - использование вычислительного календаря (фиктивного календаря, начинающегося 1 марта), который позволяет избежать проблемы с високосными годами.
Это новый алгоритм и очень быстрый. Посмотреть его можно здесь https://www.youtube.com/watch?v=0s9F4QWAl-E&t=1790s.
Источник: https: //searchfox.org/mozilla-central/source/js/src/jsdate.cpp#263
https://github.com/torvalds/linux/blob/276010551664f73b6f1616dde471d6f0d63a73ba/kernel/time/timeconv.c#L77
Реальный тест в реальном времени:
TimeToStruct 2024.11.26 17:03:55.501 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.092. Test passed in 0:01:43.931.
TimeToStruct2100Old 2024.11.26 17:10:52.902 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.081. Test passed in 0:01:41.173.
TimeToCalendar 2024.11.26 17:25:37.672 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.088. Test passed in 0:01:40.153.
TimeToStructFast 2024.11.26 17:31:59.339 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.091. Test passed in 0:01:41.471.
TimeToStruct2100Last 2024.11.26 17:37:43.948 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:01:40.996.
TimeToStruct2100Cache 2024.11.26 17:42:40.774 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.091. Test passed in 0:01:40.585.
Это тест горячего старта со всеми данными в памяти.
Общее количество вызовов функции :
2024.11.26 17:48:38.190 Core 02 2024.09.29 23:59:59 TTS Call = 191969676.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
amrali, 2024.11.26 15:58
Самая быстрая замена встроенной функции TimeToStruct(),
я рекомендую использовать эту функцию:
Так заметно (AVX) быстрее.
Реальный тест в реальном времени:
TimeToStruct 2024.11.26 17:03:55.501 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.092. Test passed in 0:01:43.931.
TimeToStruct2100Old 2024.11.26 17:10:52.902 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.081. Test passed in 0:01:41.173.
TimeToCalendar 2024.11.26 17:25:37.672 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.088. Test passed in 0:01:40.153.
TimeToStructFast 2024.11.26 17:31:59.339 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.091. Test passed in 0:01:41.471.
TimeToStruct2100Last 2024.11.26 17:37:43.948 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.084. Test passed in 0:01:40.996.
TimeToStruct2100Cache 2024.11.26 17:42:40.774 Core 02 EURUSD,H1: 8667407 ticks, 37169 bars generated. Environment synchronized in 0:00:00.091. Test passed in 0:01:40.585.
Это тест горячего старта со всеми данными в памяти.
Общее количество вызовов функции :
2024.11.26 17:48:38.190 Core 02 2024.09.29 23:59:59 TTS Call = 191969676.
Спасибо Алену за тест. Замена на встроенную TimeToStruct() работает всего в 4-5 раз быстрее, как я уже сообщал.
Однако замена TimeYear(), TimeDayOfWeek() как минимум в 10-20 раз быстрее, чем использование MQL'овской TimeToStruct().
Этот код выполняется медленно при использовании оберток встроенного StructToTime.
Использование оптимизированных функций здесь очень помогает.
Еще один момент: распаковка (TimeToStruct) всегда быстрее, чем сжатие (StructToTime). Встроенный StructToTime действительно медленнее, чем TimeToStruct().
Если ваш код создает много переменных 'datetime' из компонентов времени, вы обнаружите, что CreateDateTime() намного быстрее, чем MQL'овская StructToTime().
Я столкнулся с проблемой медленной работы StructToTime() при создании переменных времени суток для перехода на летнее время в библиотеке TimeZoneInfo. Заменив ее на эту пользовательскую CreateDateTime(), я значительно улучшил скорость работы.
Так оно заметно (AVX) быстрее.
К сожалению, не быстрее, чем текущая реализация:
К сожалению, не быстрее, чем текущая реализация:
У меня иная картина. Поделитесь исходником скрипта, пожалуйста.
Вот ошибка от 31 января.
Которая является правильной :-)
Вы упустили, что day_of_year - это индекс, основанный на нуле. Таким образом, doy=31 означает на самом деле 1 февраля.
algo_checker.mq5:
Еще быстрее.
Браво, кажется, быстрее!
Мне следует провести более масштабное тестирование, прежде чем применять эти изменения к моей функции.
Вот улучшенный скрипт для бенчмарков: