Тестирование нового компилятора MQL5 для x64 платформ - ускорение расчетов от 2 до 10 раз!

 

Как мы и обещали ранее, выпускаем новый MQL5 компилятор, оптимизированный для 64 битной версии MetaTrader 5.

Мы сохранили полную совместимость генерируемого кода как для 32 битных версий терминала, так и для старых версий терминалов.

Уже сейчас на нашем демо сервере MetaQuotes-Demo можно обновиться до MetaTrader 5 build 1108, у которого доступен новый функционал. Чтобы включить режим нового оптимизирующего компилятора, надо прописать в metaeditor.ini в раздел [Experts] ключ Optimize=1:

[Experts]
Author=Copyright 2014, MetaQuotes Software Corp.
Address=http://www.mql5.com
Optimize=1


Для тестирования производительности компиляторов MQL4, MQL5 и C++ использовались стандартные тесты компиляторов. Все исходные файлы приложены вместе с Excel таблицей результатов, так что каждый может перепроверить сам.

А пока посмотрим на результаты тестов в следующей среде:

  • Intel Xeon E5-2687W v3 @3.10 Ghz, 20 cores, 32 Gb DDR4 2100
  • MQL4 на MetaTrader 4 build 794
  • MQL5 на MetaTrader 5 build 1111 x64, обычный режим
  • MQL5 на MetaTrader 5 build 1111 x64, новый компилятор, режим Optimize=1
  • C++ на   Visual Studio 2012 Update 4, x64 код, максимальная оптимизация
  • время в миллисекундах, чем меньше - тем лучше

TestMT4 794MT5 1111 x64
MT5 1111 NewC++ x64Комментарий
 TestAckermann 3718 3109 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestArrays 15063 2531 203 31  У нас еще есть возможность улучшить результат
 TestBubbleSort 10609 2484 656 860  Удивительно, но в пузырьковой сортировке MQL5 вырвался вперед
 TestCall 922 891 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestFibo 2547 1187 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestMatrix 15375 4359 422 281  У нас еще есть возможность улучшить результат
 TestMoments 5719 4323 4078 0  Возможно, включив еще методы оптимизации, сможем выкинуть код как MSVC
 TestNestedLoop 6219 6141 0 0  Идеально, два компилятора смогли оптимизировать вычисления при компиляции, выкинув весь код
 TestPiCalculated 5047 3500 1875 1859  Ноздря в ноздрю с MSVC
 TestRandom 2375 1828 468 438  Почти одинаково с MSVC
 TestSieve 13578 4031 875 515  Близко
 TestString 187 218 422 266  Оптимизируем и обгоним MSVC, это временный провал из-за недостаточной оптимизации (руки не дошли)
 TestStrPrep 3938 3328 1703 1875  Быстрее, чем MSVC
 TestStrRev 4000 3141 2719 438  Надо разобраться
 TestStrSum 5344 2812 2844 0  Возможно, включив еще методы оптимизации, сможем выкинуть код как MSVC



Чтобы увидеть детальный график, кликните по нему, пожалуйста.


Какие выводы:

  1. MQL4 серьезно проигрывает MQL5 даже базируясь на одном компиляторе

    MQL5 быстрее MQL4 от десятков процентов до нескольких раз. Причина проигрыша в среде исполнения и 32 битах. У MetaTrader 5 гораздо более эффективная и постоянно развиваемая среда исполнения.

  2. Новый 64 битный компилятор MQL5 быстрее текущего MQL5 от 2 до 10 раз

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

  3. Новый компилятор вплотную приблизился к качеству и скорости компилятора Visual Studio 2012 x64

    Мы еще не активировали все методы оптимизаций, так как пока занимаемся тестированием. Поэтому результаты еще улучшатся.


Что это дает трейдерам?

Возможность за то же самое время проводить больше расчетов и меньше задумываться о переходе на DLL. Особенно это важно для тех, кто занимается тяжелой математикой.
 
Снимаю шляпу! Ждем соответствующего ускорения от x64-агентов. И, конечно, серьезных улучшений в возможностях самого Облака: не все получается сделать (1, 2, 3, 4).
 

Это конечно хорошая новость. Но и раньше компилятор MT4 был не намного медленнее компилятора Lattice C (ну тот, который все называют MS VS). А в паре случаев лично у меня он работал быстрее VS, что даже слегка озадачивало.

И тут есть ещё один (пару) важный вопрос:

1). При распределении  памяти для массивов  - как именно делает это компилятор MT4-MT5 - то есть правильно ли он их выделяет и выравнивает - как положено для ускорения операций SSE2 ?

2). Если он их выравнивает как положено для SSE2 - ВСЕГДА ли он так делает? И для массивов каких типов?

Для MT4-MT5 вроде как заявлена поддержка ускорения SSE2. Значит ВНУТРИ всё (все массивы для расчётов) выравнивается? Или не все?

3). Это очень важно для интерфесов с DLL. Разница в том, что если не выравнивается, то это снижает скорость работы DLL (до 40% и более), а иногда может приводить и к неожиданным зависаниям DLL, если DLL  была скомпилирована для использования SSE2.

Поэтому ещё вопрос - будет ли текущее состояние выравнивания массивов (разных типов) сохраняться в будущем?

 
Конечно выравнивает, все полностью на SSE2.