LoginSignup
11
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-11-09

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

なぜ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

さいごに

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

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10