Задать вопрос

Производительность Scala vs Python

Есть скрипт на Питоне, его задача парсить большие xml файлы — 1.5Gb и больше. В какой-то момент я уперся в производительность Питона. Питон как известно не очень быстрыя язык, но обычно его скорости хавает за глаза.
Решил что нужно перепистать программу на более быстром языке. Посмотрел всякие тесты производительности, судя по ним Скала в среднем в 10 раз быстрее Питона.

Переписал програму на Скале. Скала оказалась быстрее чем CPython, но медленне чем PyPy.
Python 7 мин 40 сек
PyPy 3 ммн 58 сек
Scala 4 мин 20 сек

Резльтат меня несколько удивил. Это моя первая программ на Скале. Прога на Скале у меня в виде скрипта, который я запускаю так
$ scala parser.scala
Будет ли это работать быстрее если скомпилить в .jar? Или может быть можно указать какие-то параметры оптимизации компиляции?

ПРОДОЛЖЕНИЕ:
Скорость работы программы на Скале меня тоже совершенно не устроила. Я пошел дальше — С++. Написал парсер без использования всяких xml парсеров и регулярок. Только стандратная библиотека, результат — 40 секунд.
Результат клевый, но мысль пошла дальше, что если на Скале также использовать только низкоуровневые средства работы со строками — результат 50 секунд. И конечно же я не мог после этого не пойти в Питон и не выкинуть все регулярки из кода.

CPython 4m12.204s
PyPy 2m47.724s
Scala 0m56.901s
C++ 0m46.801s
  • Вопрос задан
  • 9275 просмотров
Подписаться 6 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
ivnik
@ivnik
Мне кажется проблема производительности в xml парсере. Как выше уже спрашивали, используете DOM или SAX? Если критична производительность/большой объём xml-файлов, то стоит использовать SAX.

А для ускорения scala программы, имеет смысл поиграться с параметрами jvm, например включить «AggressiveOpts»:

Запускать так:

$ JAVA_OPTS="-XX:+AggressiveOpts" scala parser.scala

P.S. исходный код парсера на scala покажете?
P.P.S. и ещё, для замера производительности желательно «прогреть» jvm, производительность при первом запуске сильно ниже чем спустя некоторое время, т.к. классы ещё не загружены класслоадером и горячие точки не скомпилированы в машинный код jit компилятором. Для более правильной оценки, сделайте «бесконечный» цикл, в котором запускайте парсер, и выводите в консоль время работы парсера, затем ждите некоторое время, пока это число не стабилизируется.
P.P.P.S. Надеюсь время вы замеряете внутри программы (scala)?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы