PM.kitten События Почему Dotty Вечный сервер LazWebBox 2.0 ИПФ Назначение Статьи

native scala - быстра ли она?

Native scala.

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

В то же время, скала - это не просто оболочка над JVM - это полноценный язык, который имеет реализацию для JavaScript (scala.js) и для llvm (native scala)

Попробуем запустить простенькую программу в бинарном режиме на scala и сравнить её с программой на scala работающей в JVM.

В качестве подопытного кролика возьмём алгоритм из https://pmkitten.com/why

Что мы имеем:

Реализация на scala отрабатывает для 1000000 за 24 секунды вместе с запуском среды исполнения, реализация на питоне за 3 минуты.

Теперь то же самое с native scala

1. ставим clang:

   sudo apt install clang

2. создаём проект scala native

   sbt new scala-native/scala-native.g8

Далее перебиваем текст с картинки в файл Main.scala и выполняем сборку бинарника

   sbt nativeLink

И получаем, сначала для 100000

time ./target/scala-3.1.3/prime-out 100000
1299709

real 0m6,376s user 0m6,372s sys 0m0,004s

В то же время, для JVM реализации время будет в 6 раз меньше:

time scala Main 100000
1299709

real 0m0,663s user 0m0,912s sys 0m0,053s

получаем: -- время выполнения для бинарника scala native для 100000-чного числа время выполнения 6 секунд, -- а для scala, работающей поверх jdk 17 0.6 секунд, то есть, в 10 раз быстрее.

Для 1000000 уже не имеет смысла гонять программу - и так всё понятно, что JVM победит.

Получили результат, в два раза более медленный, чем в питоне.

Попробуем поправить sbt

Для 100000 результат уже лучше - приближен к JVM, и намного лучше питона. Теперь можно попробовать и для 1000000:

Всё равно медленее, чем JVM, но это уже терпимо.

Таким образом, рекорд быстродействия связки Scala и JVM не побит, но полученный результат показывает, что это не питон так сильно тормозит - это Scala на JVM так быстро работает. Так что не зря для реализации алгоритмов обработки больших данных используется именно она, а не питон, который служит, скорее запускалкой алгоритмов.

И видно, что не всё нативное быстрое.

Это следует понимать и сторонникам реализации математических алгоритмов на чистом C для подключения их к питону.

Вы реально уверены, что с вашей нативной реализацией не повторится та же самая история, что мы наблюдаем с нативной реализацией от native scala?

Однако, у нативного варианта есть и преимущество - памяти он занял для работы всего 8 мегабайт, а для скалы на JVM потребовалось 80 мегабайт, то есть, в 10 раз больше.

Это может быть полезно при запуске на хостинге с малым объёмом памяти.


Написано на Dotty и Wicket  !без Web 2.0Адаптировано для работы в Lynx  канал в Дзен