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

 
Rorschach #:

В зависимости от софта можно еще скорость увеличить

http://de77.com/comparison-of-ram-drives-with-benchmarks

Надо обязательно мерить на конкретном применении, поскольку скорости различаются в зависимости от размера блока, чтения/записи и последовательно/разбросанно. Непредсказуемо, какой будет впереди.

ImDisk - бесплатная (хотя не всем это важно), да и вряд ли заметно отстанет от лидера. Я бы хотел узнать результаты для тестера, если кто будет сравнивать.

И статья опять устаревшая (на 9 лет).

Повторю, что GPU-disk чуть медленнее, но выгоднее. Лучше использовать свободный VRAM, чем отнимать RAM у системы, если её не очень много. А свободной VRAM у всех есть, хотя бы 4Gb (за вычетом примерно 128Kb на дисплей). У меня - 12Gb, а дисплей на встройке.

 
fxsaber #:

В прицепе советник, который демонстрирует ускорение с экономией памяти.

В коде была опечатка. Прицепил исправленную версию.
Файлы:
 
Edgar Akhmadeev #:

свободной VRAM у всех есть, хотя бы 4Gb

Много лет без видеокарты.

 

Интересно, что RAMDrive-версия на некоторых конфигурациях быстрее FileMap-версии.

Видимо, виртуальные диски используют какой-то механизм, что быстрее memcpy.

 
fxsaber #:

Много лет без видеокарты.

Это нормально, я тоже всегда жил со встройкой, даже для игр хватало в низком качестве. Потом накупил для майнинга (8Gb), теперь есть одна с 12Gb для игр и нейросетей и VRAM-диска.

Нормально, но всё же большинство имеет дискретные GPU. А может, я переоцениваю... Опрос организовать, что ли ))

 
Edgar Akhmadeev #:

Это нормально, я тоже всегда жил со встройкой, даже для игр хватало в низком качестве. Потом накупил для майнинга (8Gb), теперь есть одна с 12Gb для игр и нейросетей и VRAM-диска.

Нормально, но всё же большинство имеет дискретные GPU. А может, я переоцениваю... Опрос организовать, что ли ))

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

 
Edgar Akhmadeev #:

 Лучше использовать свободный VRAM, чем отнимать RAM у системы, если её не очень много. А свободной VRAM у всех есть, хотя бы 4Gb (за вычетом примерно 128Kb на дисплей). У меня - 12Gb, а дисплей на встройке.

У видеопамяти задержки будут больше

 
fxsaber #:

Похоже, получилось.

Результат вычислений тот же, но при этом скорость кратно возросла: шесть секунд на расчеты и 51 миллион тиков в секунду. И это при том, что все агенты использовали одну единую память на всех!


inBlocks - сколько блоков одинаковых данных использовать. Возможно, будет влиять на многоканальные конфигурации.

Потестировал с разным числом блоков. Все тесты с 36 агентами.

В режиме по всем тикам:
IsMathMode() = false
Agents = 36
Passes = 1001
AmountTicks = 11421631 (653 MB)
Performance = 3.2 Ticks (millions)/sec.
TotalTime = 00:01:43.175

В режиме мат. вычислений:

1 блок
2 блока
3
4
9
18
36
Performance = 39.1 Ticks (millions)/sec.
TotalTime = 00:00:13.291
Performance = 40.0 Ticks (millions)/sec.
TotalTime = 00:00:14.196
Performance = 40.5 Ticks (millions)/sec.
TotalTime = 00:00:12.676
Performance = 31.1 Ticks (millions)/sec.
TotalTime = 00:00:17.233
Performance = 38.7 Ticks (millions)/sec.
TotalTime = 00:00:11.120
Performance = 30.1 Ticks (millions)/sec.
TotalTime = 00:00:14.291
 Performance = 33.8 Ticks (millions)/sec.
TotalTime = 00:00:12.813

Ускорение оптимизации по сравнению с режимом по всем тикам = 39.1/3.2=12.2 раз и по общему времени оптимизации = 103/13=7.9 раз
Увеличение числа блоков памяти роста производительности не дает. Немного странно, что не согласуется с тестом через RAM диск, но таков результат теста. Так что код можно упростить, удалив строки с выбором блока.

При оптимизации через RAM диск. Лучший результат был при 3-х блоках памяти:
Agents = 36
Performance = 20.9 Ticks(millions)/sec.
Total time in sek: 16

Но он в 2 раза медленнее по Performance и на 20% по общему времени этого варианта работы непосредственно с памятью.

Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - Попробуйте установить MetaTrader 5 build 5120 и провести тест на 36 агентах с 1 до 36 блоков памяти. Используйте свой механизм разруливания коллизий
Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - Попробуйте установить MetaTrader 5 build 5120 и провести тест на 36 агентах с 1 до 36 блоков памяти. Используйте свой механизм разруливания коллизий
  • 2025.06.26
  • Forester
  • www.mql5.com
дал ему 36 Гб памяти и протестировал на 36 агентах с 1 до 36 блоков памяти. Скрипт на 36 блоков памяти провел тест для 72 агентов - он оказался медленнее 36 агентов на 20. А что с использованием оперативной памяти в агентах тестирования
 
Forester #:

Потестировал с разным числом блоков. Все тесты с 36 агентами.

В режиме по всем тикам:
IsMathMode() = false
Agents = 36
Passes = 1001
AmountTicks = 11421631 (653 MB)
Performance = 3.2 Ticks (millions)/sec.
TotalTime = 00:01:43.175

В режиме мат. вычислений:

1 блок
2 блока
3
4
9
18
36
Performance = 39.1 Ticks (millions)/sec.
TotalTime = 00:00:13.291
Performance = 40.0 Ticks (millions)/sec.
TotalTime = 00:00:14.196
Performance = 40.5 Ticks (millions)/sec.
TotalTime = 00:00:12.676
Performance = 31.1 Ticks (millions)/sec.
TotalTime = 00:00:17.233
Performance = 38.7 Ticks (millions)/sec.
TotalTime = 00:00:11.120
Performance = 30.1 Ticks (millions)/sec.
TotalTime = 00:00:14.291
 Performance = 33.8 Ticks (millions)/sec.
TotalTime = 00:00:12.813

Вы не могли выделить память под такое количество блоков.

  template <typename T>
  PVOID Save( const T &Array[], const int Blocks = 1, const string sPath = __FILE__ )
  {
    return((this.Close() &&
            (bool)(this.Handle =kernel32::CreateFileMappingW(INVALID_HANDLE, NULL, PAGE_READWRITE, 0,
                                                             (uint)::ArraySize(Array) * sizeof(T) * Blocks,
                                                             this.Path = sPath)) &&
            (bool)(this.Ptr = kernel32::MapViewOfFile(this.Handle, FILE_MAP_ALL_ACCESS, 0, 0, 0)) &&
            FILEMAP::Save(this.Ptr, Array, Blocks))
             ? this.Ptr : !this.Close());
  }

int OnTesterInit()
{
  MqlTick Ticks[];

  Memory1 = TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE);

  return(IsMathMode() && !((FileLoad("RAMDrive\\Ticks.bin", Ticks, FILE_COMMON) > 0) &&
                           // https://www.mql5.com/ru/forum/488793/page26#comment_57301802
                           HandleMemory.Save(Ticks, 4) && // Количество блоков прописывать руками в коде.
                           ParameterSetRange("inDataTotal", false, ArraySize(Ticks), 0, 0, 0)) &&
                           (bool)(StartTime2 = GetMicrosecondCount()));
}

Для эксперимента в исходнике сделал выделение четырех блоков. Ваш блок 658 Мб, поэтому выделить четыре таких блока в памяти получится, т.к. это меньше 4-х гигабайтов.

Ограничение на 4 гига стоит, как минимум, здесь.

HANDLE  CreateFileMappingW(HANDLE hFile,PVOID lpFileMappingAttributes,uint flProtect,uint dwMaximumSizeHigh,uint dwMaximumSizeLow,const string lpName);


Если не менять исходник, то он размещает четыре блока. И можно, соответственно, варьировать inBlocks (сколько блоков использовать из выделенных) в диапазоне 1-4.

Чтобы увеличить диапазон до 1-36, нужно выделить 36 блоков, прописав их в исходнике (заменить исходные 4 на 36 в строке 232). Но для выделения 36 блоков необходимо уложиться в 4 гига, а это значит, что тиковой истории должно быть не больше ~100 Мб.

 
fxsaber #:

Вы не могли выделить память под такое количество блоков.

Для эксперимента в исходнике сделал выделение четырех блоков. Ваш блок 658 Мб, поэтому выделить четыре таких блока в памяти получится, т.к. это меньше 4-х гигабайтов.

Ограничение на 4 гига стоит, как минимум, здесь.


Если не менять исходник, то он размещает четыре блока. И можно, соответственно, варьировать inBlocks (сколько блоков использовать из выделенных) в диапазоне 1-4.

Чтобы увеличить диапазон до 1-36, нужно выделить 36 блоков, прописав их в исходнике (заменить исходные 4 на 36 в строке 232). Но для выделения 36 блоков необходимо уложиться в 4 гига, а это значит, что тиковой истории должно быть не больше ~100 Мб.

Да, уже заметил ограничение памяти. Когда задал 5 блоков и больше - появилась ошибка.
А так же ошибка даже с 1-м блоком, если сохранить историю с 2023.01.01 по сегодня.

После обеда попробую взять меньше истории для 36 блоков - это около 1 месяца будет.
Но если нужны тесты за несколько лет, то  видимо надо через RAM диск работать (.