Почему цель C++ в 6 раз медленнее, чем цель Java

Теперь у меня есть 2 важных примера, показывающих следующее время выполнения:

           Java    C++  FileSize    Slowdown C++/Java

Пример 1: 85 с 533 с 2528699 6,2x Пример 2: 64 с 246 с 1031993 3,8x

Я уверен, что у моей грамматики есть проблемы (отдельная проблема, которую я начинаю решать), но что может быть возможной причиной медленности C++ по сравнению с реализацией Java? Весь код C++ (среда выполнения Java, сгенерированный синтаксический анализатор) компилируется с -O2 на машине Linux. Та же машина, та же грамматика, использовались те же файлы примеров. Я удостоверился, что сравниваю только время разбора. В любом случае ходьба по AST занимает 1 секунду.

Спасибо Ален

Вы запускали этап синтаксического анализа хотя бы два раза подряд? Есть фаза прогрева, которая значительно медленнее, чем последующие прогоны синтаксического анализа.

Mike Lischke 27.09.2018 08:54

Я не могу в своем приложении, мне нужно обрабатывать файлы "холодно", мне нужно запускать новый парсер для каждого файла. Вы хотите сказать, что разминка в реализации на C++ тяжелее, чем в реализации на Java? Как вы объясняете разницу?

Alain Marcel 28.09.2018 07:04

Позвольте мне добавить некоторую точность: в одном и том же исполнении (во время выполнения) я запускаю несколько потоков, которые анализируют биты и фрагменты файлов, я создаю и удаляю экземпляры лексеров и парсеров, но я предполагаю, что обучение кэшируется в каком-то глобальном (статическом) структура данных и не зависит от парсеров? Я предварительно компилирую некоторые большие файлы (пакеты) в одном потоке и сохраняю AST на диске, это примеры, на которые я указываю, когда я это делаю, он находится в другой среде выполнения, поэтому каждый запускается холодно. Здесь я вижу более резкую разницу между синтаксическим анализатором C++ и Java.

Alain Marcel 28.09.2018 07:17

Да, разминка требуется для создания некоторых общих статических структур (DFA с конфигурациями ATN). Это требует больше времени на C++ из-за того, что требуется shared_ptr, который относительно медленный. После кэширования данных вы можете создавать и удалять столько парсеров, сколько захотите. Все они используют эти общие данные.

Mike Lischke 28.09.2018 08:42

Думаю, нам придется дождаться C++ 20: open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4162.pdf

Alain Marcel 29.09.2018 06:36

У меня есть более серьезный вопрос: что послужило причиной статичности кеша? Почему бы не сделать его объектом, передаваемым анализаторам? и вообще не используйте shared_ptr, сделайте систему действительно независимой от потоков.

Alain Marcel 29.09.2018 21:07

В моем случае каждый поток анализирует множество файлов, но я сначала вычисляю балансировку нагрузки по размеру файла (и / или разбиваю его на фрагменты), что в значительной степени гарантирует, что все потоки завершатся почти одновременно. В потоке я вижу полезность совместного использования кеша. Но между потоком, не совсем (Может, на память). Что нужно для такого изменения?

Alain Marcel 29.09.2018 21:15

Кроме того, есть ли способ сохранить / восстановить DFA?

Alain Marcel 01.10.2018 06:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
126
0

Другие вопросы по теме