Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - страница 25

 
fxsaber #:

Производительность почти не зависит от размера блоков чтения (см. входной inBlockSize): пробовал 10К и 100К.

Такая зависимость для одного включенного агента.

Т.е. сильно зависит от того, какими порциями читать.

 
fxsaber #:

И составил соответствующую таблицу.

Количество Агентов Производительность (миллионов тиков в секунду)
1 48.9
2 32.5
3 24.7
4 18.4
5 15.1
6 16.8

Доступ пяти агентов к одному и тому же куску памяти (через RAMDRive) происходит в три раза медленнее, чем с включенным только одним агентом. Видимо, сказывается разруливание коллизий при одновременном чтении данных.

Попробовал на своем компе с 36 физ (72 лог) ядрами.  И как предлагал сделал чтение на выбор из 1 блока памяти или из 4-х. Код доработанного эксперта приложен.

1 блок памяти
4 блока памяти
Agents = 1
Performance = 68.8 Ticks(millions)/sec.
2 мин 45 сек

Agents = 4
Performance = 42.3 Ticks(millions)/sec.
1 мин 07 сек
Agents = 4
Performance = 40.2 Ticks(millions)/sec. - замедление 5%
1 мин 11сек
Agents = 8
Performance = 39.1 Ticks(millions)/sec.
36 сек
Agents = 8
Performance = 35.4 Ticks(millions)/sec. - замедление 9%
40 сек
Agents = 16
Performance = 35.3 Ticks(millions)/sec. (31.4 при др. запуске)
21 сек
Agents = 16
Performance = 31.9 Ticks(millions)/sec. (29.7 при др. запуске) - замедление 9 (6)%
22 сек
Agents = 36
Performance = 4.1 Ticks(millions)/sec. (4.8 при др. запуске)
1 мин 20 сек (1:17 при др. запуске)
Agents = 36
Performance = 22.6 Ticks(millions)/sec. (13,2 при др. запуске) - ускорение 5.5 (2.7) раз
15 сек (25 сек при др. запуске)
Agents = 72
Performance = 2.0 Ticks(millions)/sec.
1 мин 22 сек
Agents = 72
Performance = 7.5 Ticks(millions)/sec. - ускорение 3.7 раза
25 сек

Для 4 агентов чтение из 1 блока памяти на 5% быстрее, чем чтение из 4 блоков памяти (аналог того как сейчас работают агенты - у каждого свой блок памяти), но потребление памяти кратно числу агентов.

Для 8 агентов ускорение на 9%, а экономия памяти - в 8 агентов /4 блока памяти = 2 раза.

Для 16 агентов ускорение на 9%, а экономия памяти - в 16/4=4 раза.

Для 36 агентов замедление в 3-5 раз, а экономия памяти - в 36/4=9 раза.

Для 72 агентов замедление в 4 раза, а экономия памяти - в 72/4=18 раз.

Для моего процессора немного менялась скорость каждого ядра в зависимости от нагрузки. А процессоров 2 штуки - т.е. значения нужно *2
3600 MHz (1-2 ядра) 4 агента на 2 процессора
3300 MHz (4 ядра)    8 агентов
2900 MHz (8 ядер)   16 агентов
2800 MHz (9 и больше ядер)  36 и 72 агента

Т.е. для 4 и 8 агентов процессор на 10-15 % работал быстрее, чем для 16 и больше агентов. Возможно что 4 агента работали быстрее, чем 8 или 16 только за счет процессора, а не памяти.

На мой взгляд самое оптимальное 16 агентов с 4 блоками памяти - это дает экономию памяти в 4 раза. Замедление при этом 31.9 / 40.2 = 20% в сравнении с вариантом, когда каждому агенту выделен свой блок памяти (в таблице это 4 агента и 4 блока памяти). 10% из этих 20 связано с процессором. Т.е. соотношение 4 агента на 1 блок памяти - лучшее, значит для 36 агентов 9 блоков памяти было бы лучшим вариантом.

Память у меня 2-х канальная и 2 процессора. От каждого процессоа по 2 канала в память -> итого 4 одновременно работающих канала. Возможно поэтому 4  блока памяти стало оптимальным.


Протестировать с 16 или 36 блоками памяти нет возможности, т.к. мой RAM диск только 4Гб памяти может использовать. Возможно с таким тестом картина была бы яснее.

Файлы:
test2.mq5  6 kb
 

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

Обновление платформы MetaTrader 5, сборка 5120: улучшения и исправления

Ален Верлейен , 2025.06.25 21:17

Если я ничего не пропустил, похоже, команда «Найти в файлах» была удалена из контекстного меню MetaEditor. Почему?!

Не могли бы вы восстановить его, он очень полезен, даже если нечасто используется. Спасибо.



 
Alain Verleyen # :

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

Обновление платформы MetaTrader 5, сборка 5120: улучшения и исправления

Ален Верлейен , 2025.06.25 22:10

Хорошо, я подтверждаю, что «Найти в файлах» есть при подключении к хранилищу Git в ME.

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


 
Forester #:

Попробовал на своем компе с 36 физ (72 лог) ядрами.  И как предлагал сделал чтение на выбор из 1 блока памяти или из 4-х. Код доработанного эксперта приложен.

Для использования этого эксперта 4 файлa создаются скриптом в папке /RAM: (папку нужно переименовать на вашу)
void OnStart()
{
  MqlTick Ticks[];
  
  if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2025.01.01' * 1000) > 0)
  {
    Print(MQLInfoInteger(MQL_MEMORY_USED));
    
    FileSave("RAM\\0Ticks.bin", Ticks, FILE_COMMON);
    FileSave("RAM\\1Ticks.bin", Ticks, FILE_COMMON);
    FileSave("RAM\\2Ticks.bin", Ticks, FILE_COMMON);
    FileSave("RAM\\3Ticks.bin", Ticks, FILE_COMMON);
  }
}
 
Forester #:
Для использования этого эксперта 4 файлa создаются скриптом в папке /RAM: (папку нужно переименовать на вашу)

У меня никакого влияния от количества блоков.


Таким образом создал блоки.

void OnStart()
{
  MqlTick Ticks[];
  
  if (CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2025.03.01' * 1000) > 0)
    for (int i = 0; i < 6; i++)
      FileSave("RAMDrive\\Ticks" + (string)i + ".bin", Ticks, FILE_COMMON);
}


Так их читаю.

sinput int inBlocks = 1;

double OnTester()
{
  const ulong StartTime = GetMicrosecondCount();
  
  MqlTick Ticks[];
  
  // https://www.mql5.com/ru/forum/487790/page38#comment_56964098
  const int NumFile = (int)StringSubstr(TerminalInfoString(TERMINAL_DATA_PATH), -3) % inBlocks;
  
  const int Handle = FileOpen("RAMDrive\\Ticks" + (string)NumFile + ".bin", FILE_SHARE_READ | FILE_BIN | FILE_COMMON);
Файлы:
 
fxsaber #:

У меня никакого влияния от количества блоков.

Таким образом создал блоки.

Так их читаю.

Возможно поэтому:

Forester #:

Память у меня 2-х канальная и 2 процессора. От каждого процессоа по 2 канала в память -> итого 4 одновременно работающих канала. Возможно поэтому 4  блока памяти стало оптимальным.

если у вас 1 процессор и 1 канал в памяти.
 
Forester #:

Возможно поэтому:

если у вас 1 процессор и 1 канал в памяти.

Не знаю, как посмотреть.

 
fxsaber #:

Не знаю, как посмотреть.

Я по спецификации памяти узнал, что она 2-х канальная. Поиском по полному названию модуля памяти.

 
Forester #:

Я по спецификации памяти узнал, что она 2-х канальная. Поиском по полному названию модуля памяти.

Тут про каналы подробно https://habr.com/ru/companies/kingston_technology/articles/564350/
Еще и от платы и проца зависит.
Серверная память: DDR3/4, Buffered, …unBuffered, ECC? Помогаем разобраться с выбором памяти для различных платформ
Серверная память: DDR3/4, Buffered, …unBuffered, ECC? Помогаем разобраться с выбором памяти для различных платформ
  • 2021.06.25
  • habr.com
Пока компьютерный прогресс бежит сломя голову, в стане серверов остаются доступными совершенно различные конфигурации, как современные, так и 5-10 летние железки. И в момент подбора комплектующих для апгрейда возникает закономерный вопрос, а какую память и в каком количестве доустанавливать или менять? Помимо привычного разъема DIMM...