Особенности языка mql5, тонкости и приёмы работы - страница 307
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я не считаю, что использование чистых макросов — это решение. Использование вспомогательной функции, например StringSubst() или Print(), которая вычисляется во время выполнения, может помочь избежать стандартного порядка раскрытия параметров макроса (2 шага). Такова семантика работы компилятора C.
Я не считаю это решением при использовании чистых макросов. Использование вспомогательной функции, например StringSubst() или Print(), которая оценивается во время выполнения, может помочь избежать стандартного порядка расширения параметров макроса (2 шага). Это семантика работы компилятора C.
Чистые макросы?
Макросы в MQL не обладают всеми возможностями C++. И даже макросы C++ очень ограничены, по сравнению с некоторыми существующими решениями (такими как M4, например).
Чего я никогда не пойму, так это почему компания решила создать собственный язык (MQL), чтобы в итоге использовать рядом с ним архаичную систему макросов. Все эти функции должны быть лучше реализованы непосредственно в языке.
В любом случае, нам придется с этим смириться.
b5179, попробовал ускорить вычисления за счет создания таблицы заранее рассчитанных данных. Но ускорения не получил, т.к. каждое обращение к элементу массива по индексу внутри MQL5 вызывает проверку корректности индекса, даже если в коде все безошибочно.
Тогда решил попробовать создать объект, у которого обращение к индексу идет БЫСТРЕЕ, чем в массиве. И у меня "получилось"!
В кавычках, потому что получил необъяснимые результаты.
Производительность этого кода колоссально зависит от того, выбрана оптимизация в компиляторе или нет. А также от включенных инструкций(x64, AVX, ...).
Оказывается, есть способ доступа к элементам по индексу на 8-9% быстрее, чем к элементам массива.
А дальше начинаются необъяснимые вещи, которые подсветил в исходнике. По какой-то причине таблица так быстро вычисляется только в том случае, если она облачена в макрос. Из-за этого макроса пришлось добавить соответствующий #include. И у меня не получается этот макрос воспроизвести без этого #include - замедление в сотни раз.
Также происходит такое же дикое замедление, когда количество вычисляемых элементов немного возрастает - см. комментарий к AMOUNT.
Еще претензия к компилятору. В исходнике индекс элемента массива uchar-типа, а количество элементов соответствующего статического массива 2048 - что явно больше UCHAR_MAX. Так зачем компилятор проверяет каждый раз индекс на выход за пределы массива?
Прошу не делать такие проверки в подобные ситуациях. И просьба объяснить аномальные поведения скрипта выше. Как и сообщить, возможно ли делать таблицы данных в статических массивах, чтобы не было проверок на индекс при каждом обращении?
Строка для поиска: Uluchshenie 130.b5179, я пытался ускорить вычисления, создав таблицу с заранее рассчитанными данными. Но ускорения не получилось, так как каждое обращение к элементу массива по индексу в MQL5 вызывает проверку корректности индекса, даже если все в коде безошибочно.
5. Было бы интереснее измерять время случайного доступа, а не последовательного, чтобы свести на нет влияние кэша процессора на результаты:
Здесь есть несколько моментов, на которые стоит обратить внимание:
1. Проверка индексов для массивов выполняется только во время компиляции (если компилятор может определить границы массива) и никогда во время выполнения, поэтому вы можете получить ошибку "array out of index" во время выполнения, если ваш индекс находится за границами массива.
Не согласен. Именно во в время выполнения идет проверка выхода за пределы массива (как и проверка на валидность указателя каждый раз, когда идет работа через него).
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Новая версия платформы MetaTrader 5 build 4260: общие улучшения
Renat Fatkhullin, 2024.03.28 02:01
Требования безопасности языка не позволяет пропускать контроль индексного доступа.
Я не согласен. Именно во время выполнения происходит проверка на выход массива за границы (а также проверка на валидность указателя при каждом обращении к нему).
Хороший способ перемешать индексы. Спасибо.
Более простой микс (Fixed):
Если при сложении делать дополнительную битовую операцию, то скорость выполнения возрастает на 40%.
Строка для поиска: Oshibka 139.