Я использую парсер ANTLRv4 для обработки большого количества файлов на машине с несколькими ядрами. Чтобы получить дополнительную скорость, я хотел бы обрабатывать файлы параллельно.Запуск нескольких экземпляров lexer/parser ANTLR4 параллельно
Чтобы проверить, является ли производительность парсера привязана к ЦП, я разбил файлы на группы и проанализировал их с помощью независимых процессов, каждый из которых запускал один и тот же парсер в отдельном экземпляре JVM. Это значительно увеличило производительность.
Это побудило меня попробовать то же самое, используя несколько потоков вместо процессов, однако, без успеха. Я создал два рабочих потока, каждый со своим собственным экземпляром парсера, lexer и файловым потоком. Полученные результаты верны, однако использование двух потоков фактически занимает немного больше времени, чем использование одного.
Чтобы убедиться, что я правильно использую потоки и нет проблем с установкой JVM, я временно заменил код синтаксического анализа кодом, который вычисляет последовательности Fibonacci: в этом случае использование нескольких потоков приводит к тому, увеличение.
При анализе этого поведения я обнаружил, что при использовании нескольких секций синтаксического анализа ни один из процессоров не достигает высокого уровня использования. Похоже, что потоки борются за какой-то общий ресурс.
Взглянув на исходный код ANTLR, я нашел следующий комментарий в ParserATNSimulator.java:.
«Все экземпляры одного и того же доли парсера такое же решение ДКА через статическое поле Каждый экземпляр получает свой собственный ATN симулятор, но они используют одно и то же поле decisionToDFA. Они также используют объект PredictionContextCache, который гарантирует, что все объекты PredictionContext распределяются между состояниями DFA, что приводит к большой разнице в размерах ».
Мне интересно, вызывает ли синхронизированный доступ к этим общим ресурсам проблемы с производительностью. Если да, существует ли возможность создания уникальных экземпляров этих ресурсов? Или может быть, даже гораздо более простое решение проблемы?
Заранее благодарен!
Фабиан
Спасибо за ваш ответ. Возможно ли, что ваша оптимизированная версия основных алгоритмов будет включена в официальный релиз в какой-то момент? – user2202828