Scala
JRuby

JRubyからScalaの関数をつかう → はやい

More than 3 years have passed since last update.


乗るしかないこのビッグウェーブに

なぜScalaがないのか。


Scalaでのフィボナッチ数列


FibApp.scala

object FibApp extends App {

def fib(n: Int): Int = {
n match {
case n if (n <= 1) => n
case n => fib(n - 1) + fib(n - 2)
}
}

println(fib(40))
}


$ scala -version

Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL

$ scalac FibApp
$ time scala FibApp
102334155
0.74 real 0.73 user 0.06 sys

まずまずのパフォーマンスですね。(Rust、Crystalより遅いけどGoより速い?)


JRubyから呼んでみる

皆さんもうJRubyの存在を忘れているのかもしれませんが、JRubyがあれば require "ffi" して Moduleでゴニョゴニョとかしなくても.classを簡単に呼ぶことができます!!


Fib.scala

object Fib {

def fib(n: Int): Int = {
n match {
case n if (n <= 1) => n
case n => fib(n - 1) + fib(n - 2)
}
}
}


scala-fib.rb

require 'java'

java_import 'Fib'

puts Fib.fib(40)


$ ruby -v

jruby 9.0.0.0 (2.2.2) 2015-07-21 e10ec96 Java HotSpot(TM) 64-Bit Server VM 25.60-b23 on 1.8.0_60-b27 +jit [darwin-x86_64]

$ scalac Fib
$ time ruby scala-fib.rb
102334155
2.34 real 4.95 user 0.40 sys

うっ、恐らくJVMの起動がネックに...


Nailgunを使う

Nailgunを使えば、バックグランドでJVMを起動させておくことができ、JVM起動のオーバーヘッドを解消できます。

1回目はオーバーヘッドがあるので以下は2回目の実行。

$ jruby --ng-server

NGServer 0.9.1 started on all interfaces, port 2113.

$ time jruby --ng scala-fib.rb
0.83 real 0.01 user 0.02 sys

素のScalaとほぼ同等になりましたね。


ちなみに

素のJRubyでもCRubyよりは速いですね。

$ time jruby --ng fib.rb

7.72 real 0.01 user 0.02 sys


さいごに

元記事通り、それぞれの得意分野でよろしくやっていくのが平和だと思います。