Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасибо за подробный обзор. Ваши замечания подтолкнули библиотеку вперед. Вот техническая информация о том, что было добавлено в v3.4.0:
Принятые оптимизации
1. Сериализация с нулевым распределением (больше никаких строк)
Вы были абсолютно правы насчет того, что IntegerToString() создает временные MQL-строки, которые давят на GC. Я реализовал PutRawInteger и PutRawDouble для записи цифр непосредственно в байтовый буфер.
// Old (Heap Allocation): PutRaw(IntegerToString(GetInt(idx)), out, pos, cap); // New v3.4.0 (Zero-Alloc, Direct Buffer Write): void PutRawInteger(long value, uchar &out[], int &pos, int &cap) { // ... writes bytes '0'-'9' directly to out[] ... }2. Гибридный парсинг длинных/двухзначных чисел + таблица Exp10
Я принял вашу идею накапливать целые числа как длинные (более быстрые операции ALU) и использовать таблицу поиска для дробной части (лучшая точность FP). Однако я добавил меры безопасности, которые отсутствовали в вашем фрагменте:
// My implementation of your suggestion (with safety): if (use_long && int_val < 922337203685477580) { // LONG_MAX / 10 int_val = int_val * 10 + (c - '0'); } else { // Overflow guard: Fallback to double if number > 19 digits if (use_long) { val = (double)int_val; use_long = false; } val = val * 10.0 + (c - '0'); }Это дает нам скорость целых чисел в 99,9% случаев, но при этом безопасно обрабатывает массивные числа (например, 30-значные бигинты) без тихого переполнения.
Отклоненные предложения (и почему)
1. Использовать c > '9' в качестве разделителя.
Это ослабляет соответствие RFC 8259. Ввод типа 123abc будет молча принят как 123. Я сохранил явные проверки:
2. Удаление & 0xFF из GetType()
Это не лишнее. long в MQL5 является знаковым. Если в ленточном значении установлен 63-й бит (большое смещение), то >> 56 выполняет арифметический сдвиг, заполняя старшие биты 1s. Маска необходима для корректности.
3. Вывод if (i > 0) за пределы цикла
Предсказатель ветвлений процессора справляется с этим паттерном (1 промах на цикл) с незначительными затратами (~15 циклов). Это не оправдывает дублирование кода.
Версия 3.4.0 уже доступна. Спасибо за сотрудничество.
Отклоненные предложения (и почему)
1. Использование c > '9' в качестве разделителя
Это ослабляет соответствие стандарту RFC 8259. Ввод типа 123abc будет молча принят как 123. Я сохранил явные проверки:
Спор о соответствии RFC 8259 касается принципа надежности (закон Постела) против строгости при обмене данными.
Ссылка: RFC 8259, раздел 6 (Числа)
Грамматика определяется следующим образом:
Грамматика не позволяет использовать символы с конца, такие как 'a', 'b', '-' и т. д. Значение типа 123abc не является числом. Это неправильно сформированный токен.
Если парсер использует c > '9' в качестве условия остановки, он потребляет 123 и оставляет abc в буфере. В высокоскоростном синтаксическом анализаторе такое поведение неоднозначно:
Применяя c == '.' || c == 'e' || c == 'E', мы явно заявляем: "Это ЕДИНСТВЕННЫЕ допустимые продолжения для числа". Все остальное вызывает немедленную проверку на структурные разделители ( , } ] или пробельные символы) в вызывающем цикле или мгновенную ошибку.
Это выбор дизайна: Fail Fast vs. Fail Later. Для финансовых данных (цены/объемы) я отдаю предпочтение Failing Fast при любой неоднозначности, а не экономии 1 процессорного цикла на цифру.
Надеюсь, это прояснило ситуацию!
Надеюсь, это прояснит ситуацию!
Мы говорим о парсере только в FastAtof, где длина n_len уже известна. Поэтому мое условие не может создать ни малейшей проблемы.
Вы абсолютно правы. Поскольку n_len уже определяется парсером перед вызовом FastAtof , ограничения строго контролируются, поэтому предложенное вами условие ( c > '9' ) действительно безопасно и не может вызвать проблем.
Я применил его оптимизацию в последней версии (v3.4.2). Чтобы проверить влияние на производительность и убедиться в надежности, я провел бенчмарк-тест с использованием реальных рыночных данных из Binance API (OHLCV, Depth, Trades) против `JAson`. Результаты подтверждают, что анализатор работает стабильно и невероятно быстро.
Среда: MetaTrader 5 build 5614, Intel Core i7-10750H @ 2,60 ГГц
100 свечей x 12 полей
100 уровней (вложенные массивы)
100 обменов (Различные элементы)
Еще раз спасибо за то, что настаивали на деталях. Теперь код стал чище и быстрее.
🔗 Обновленный репозиторий: GitHub/Forge
предложенное вами условие ( c > '9' ) действительно безопасно и не может вызвать проблем.
Интересный результат.
Результат.
Таким образом, двойную проверку можно заменить одинарной.
Результат.
Имеет смысл создать счетчик для каждого условия.
При работе с числами вы делаете двойной проход по массиву.
Торговый форум, автоматические торговые системы и тестирование торговых стратегий
Библиотеки: Библиотека JSON для LLM
fxsaber, 2026.02.19 09:02
Более универсальный вариант.Идеальный вариант.