2013-03-23 10 views
2

Я использую парсер ANTLRv4 для обработки большого количества файлов на машине с несколькими ядрами. Чтобы получить дополнительную скорость, я хотел бы обрабатывать файлы параллельно.Запуск нескольких экземпляров lexer/parser ANTLR4 параллельно

Чтобы проверить, является ли производительность парсера привязана к ЦП, я разбил файлы на группы и проанализировал их с помощью независимых процессов, каждый из которых запускал один и тот же парсер в отдельном экземпляре JVM. Это значительно увеличило производительность.

Это побудило меня попробовать то же самое, используя несколько потоков вместо процессов, однако, без успеха. Я создал два рабочих потока, каждый со своим собственным экземпляром парсера, lexer и файловым потоком. Полученные результаты верны, однако использование двух потоков фактически занимает немного больше времени, чем использование одного.

Чтобы убедиться, что я правильно использую потоки и нет проблем с установкой JVM, я временно заменил код синтаксического анализа кодом, который вычисляет последовательности Fibonacci: в этом случае использование нескольких потоков приводит к тому, увеличение.

При анализе этого поведения я обнаружил, что при использовании нескольких секций синтаксического анализа ни один из процессоров не достигает высокого уровня использования. Похоже, что потоки борются за какой-то общий ресурс.

Взглянув на исходный код ANTLR, я нашел следующий комментарий в ParserATNSimulator.java:.

«Все экземпляры одного и того же доли парсера такое же решение ДКА через статическое поле Каждый экземпляр получает свой собственный ATN симулятор, но они используют одно и то же поле decisionToDFA. Они также используют объект PredictionContextCache, который гарантирует, что все объекты PredictionContext распределяются между состояниями DFA, что приводит к большой разнице в размерах ».

Мне интересно, вызывает ли синхронизированный доступ к этим общим ресурсам проблемы с производительностью. Если да, существует ли возможность создания уникальных экземпляров этих ресурсов? Или может быть, даже гораздо более простое решение проблемы?

Заранее благодарен!

Фабиан

ответ

5

Ссылки вариант выполнения ANTLR 4 предназначен для безопасных при использовании нескольких потоков синтаксического анализа (до тех пор, используется в качестве нескольких экземпляров СА). Я поддерживаю альтернативную (неофициальную) ветвь ANTLR 4, которая реализует основные алгоритмы по-другому, чтобы повысить производительность в многопоточных сценариях.

Эта отрасль предоставляет несколько иной API в некоторых областях, так что это не капля в замене для выпуска 4.0 ANTLR 4.

https://github.com/sharwell/antlr4/tree/optimized

+0

Спасибо за ваш ответ. Возможно ли, что ваша оптимизированная версия основных алгоритмов будет включена в официальный релиз в какой-то момент? – user2202828

Смежные вопросы