Выполнение Node-приложения из Scala в 10 раз медленнее - PullRequest
1 голос
/ 23 октября 2019

У меня есть простое приложение Node, которое читает и записывает файл JSON.

Ниже показано, как приложение Node выполняется из Scala.

case class ExecResult(exitValue: Int, stdout: String, stderr: String)

def execAsync(cmd: String)(implicit ec: ExecutionContext): Future[ExecResult] = {
  val promise = Promise[ExecResult]
  val proc = Process(cmd).run(ProcessLogger(...))
  promise.tryCompleteWith(Future(proc.exitValue()).map(c => ExecResult(c, stdout.get, stderr.get)))
  promise.future
}

Время выполнения этого занимаетпочти в 10 раз больше, чем выполнение напрямую.

Что может быть причиной такой медлительности?

1 Ответ

1 голос
/ 23 октября 2019

Существует нетривиальное количество накладных расходов при вызове для запуска внешнего процесса (возможно, вплоть до включения оболочки (например, bash) для запуска этого процесса).

Дополнительно, в зависимости от того, как выизмеряя это, вы также можете фиксировать фазу запуска и прогрева JVM (при условии, что мы говорим о Scala на JVM).

Особенно, если читаемый файл JSON мал, эти издержки могут затормозить фактическое времяприложение Node.js запущено.

Я не собираюсь спрашивать, почему вы хотите запустить приложение Node.js из Scala, но если вы хотите сделать что-то подобное, я бы посоветовал посмотретьв graalvm, который позволяет вам запускать большинство / любых приложений Node.js непосредственно в JVM, включая вызовы из него, например, из Scala без дополнительных затрат на создание внешнего процесса. В зависимости от варианта использования graalvm может на самом деле быть быстрее, чем стандартная реализация узла на основе V8.

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