Как уменьшить загрузку Scala (/ Java)? - PullRequest
22 голосов
/ 22 августа 2009

Я довольно не осведомлен о мире Java (я в основном C / Python), но Scala выглядел достаточно интересным, чтобы привлечь меня. Одна проблема, с которой я столкнулся, - это огромные накладные расходы при запуске - минимум 0,3 секунды, гораздо больше если я использую интерпретатор вместо компиляции, по сравнению с фактически 0 для Python или C. Так что, несмотря на то, что язык работает в десятки раз быстрее, чем Python, если я пытаюсь использовать его для простых задач, он все еще значительно медленнее на практике.

Есть ли способ сократить это время или это неизбежная часть JVM + количество необходимых (неявных) импортов для программы Scala?

Ответы [ 3 ]

15 голосов
/ 22 августа 2009

На каком компьютере вы его используете? Очевидно, что при запуске JVM возникают накладные расходы, но это еще больше, если JVM обнаруживает, что вы работаете на машине серверного класса .

В платформе J2SE версии 5.0 класс машины, называемой машиной серверного класса, был определен как машина с:

  • 2 или более физических процессора
  • 2 или более Гбайт физической памяти

Вы можете перевести JVM в режим клиента , используя опцию -client. клиентский режим настроен для быстрого запуска.

Существует также переход к модульной JVM (проект Jigsaw ), который еще больше улучшит время запуска - это имеет началось с JDK 1.6.0_10.

8 голосов
/ 22 августа 2009

Вы можете обойти время запуска JVM, открыв Scala REPL, а затем загрузив свои скрипты прямо в него, используя команду :load. Это компилирует (это занимает некоторое время, но на практике я не нахожу это долго) содержимое скрипта и загружает его для использования в REPL. Например:


scala> :load testScript.scala
Loading testScript.scala...
import scala.collection.mutable.Map
memory: scala.collection.mutable.Map[Int,Int] = Map()
fib: (Int)Int
res7: Int = 165580141

scala> fib(10)
res1: Int = 55

scala> fib(11)
res2: Int = 89

scala> fib(12)
res3: Int = 144

scala> fib(13)
res4: Int = 233

Например, мой типичный рабочий процесс при написании различных прототипов в Scala выглядит следующим образом. У меня есть текстовый редактор, открытый в одном окне, и Scala REPL в другом. Я пишу свой код, а затем загружаю его (:load script.scala). Результаты, полученные сценарием, сразу же доступны (как видно из приведенной выше расшифровки, res7), а также доступны любые функции, классы или объекты, определенные в сценарии. И это быстрее, чем запуск scala myScript.scala, поскольку JVM уже загружена.

Если вы идете по скомпилированному маршруту, используйте fsc (быстрый компилятор Scala). При первом запуске он создает процесс-демон, который компилирует код. Поэтому вам нужно будет заплатить стартовую цену JVM только один раз. Просто обратите внимание, что если вы измените значение CLASSPATH (переменная окружения), вам придется перезапустить fsc (это то, что меня давно не беспокоило).

-- Flaviu Cipcigan

8 голосов
/ 22 августа 2009
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...