乗るしかないこのビッグウェーブに
- RubyからGoの関数をつかう → はやい
- Crystalで書く → はやい
- RubyからRustの関数をつかう → はやい
- RubyからGoの関数をつかわなくても再帰をやめる → はやい
- Ruby で書く→速い
- Common Lispで書く→はやい
- Node.jsをつかう → はやい
- Perl6からGoの関数をつかう → はやい?
なぜ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
さいごに
元記事通り、それぞれの得意分野でよろしくやっていくのが平和だと思います。