Ruby는 얼마나 좋아졌을까

Ruby는 2.0 preview1 버전이 발표되었습니다. 근래 Scala를 공부했는데 특징중에 Java에 비해 크게 속도가 떨어지지 않고 객체지향과 함수형 언어를 지향한다는 것을 보고 각종 ruby와 scala를 한번 비교해 보았습니다.

여러가지 검사를 시행해야 정확하겠지만 단순히 모 사이트에 나와 있는 문제를 푸는 프로그램을 작성해 보았습니다. Fibonacci 수열중에 4000000보다 작은 값들 중 짝수값들의 합을 구하는 것입니다.

먼저 Ruby 소스.
INFINITY = 1.0/0
MAX = 4000000

def fib(n)
 case n
  when 1..2 then n
 else
  fib(n-1) + fib(n-2)
 end
end

# ruby 1.9.3, jruby 1.7.0, macruby 0.12
n = 1
sum = 0
while (c = fib(n)) < MAX
 sum +=  c if c.even?
 n += 1
end
p sum

# for ruby 2.0
p (1..INFINITY).lazy.map{ |n| fib(n) }.take_while{ |n| n < MAX }.select(&:even?).inject(:+)
다음은 scala 소스 입니다. 그리 잘 만들었다고 생각되지는 않지만 방식은 대충 같습니다.
object App {
 def fibSumUnder(m:Int) = {
  def fib(n:Int):Int = 
   if (n <= 2) n
   else fib(n-1) + fib(n-2)
  def fibSumUnder0(n:Int, sum:Int):Int = {
   val fibResult = fib(n)
   if (fibResult >= m) sum
   else if (fibResult % 2 == 0) fibSumUnder0(n+1, sum+fibResult)
   else fibSumUnder0(n+1, sum)
  }
  fibSumUnder0(1, 0)
 }
 
 def main(args:Array[String]) = {
  print(fibSumUnder(4000000))
 }
}

App.main(args)
Ruby는 rvm을 사용해서 ruby 1.9.3p125, ruby 2.0.0dev, jruby 1.7.0, macruby 0.12을 설치해서 사용했고, scala는 2.9.2입니다. 프로그램 실행시간은 다음과 같은 방식으로 2번 측정해서 빠른 값을 얻었습니다.
$ time ruby fib_test.rb
$ time scala fib_test.scala
결과는 다음과 같습니다.
# ruby 1.9.2p125
real 0m17.822s
user 0m17.071s
sys 0m0.032s
# jruby 1.7.0
real 0m12.762s
user 0m14.480s
sys 0m0.491s
# ruby 2.0.0dev
real 0m11.163s
user 0m10.719s
sys 0m0.023s
# ruby 2.0.0dev 2.0용 lazy 문 사용한 경우
real 0m11.600s
user 0m10.751s
sys 0m0.028s
# macruby 0.12
real 0m10.077s
user 0m9.738s
sys 0m0.035s
# scala 2.9.2
real 0m2.024s
user 0m1.351s
sys 0m0.161s
# scala 2.9.2 컴파일한 경우
real 0m1.253s
user 0m1.206s
sys 0m0.149s
그래프도 막 그리고 할까 생각해 보았는데 한 가지 프로그램으로 제대로 된 비교는 힘들것 같고 컴퓨터에 여러가지 프로그램들도 띄워져 있고 해서 그냥 대충 비교만 하기로 했습니다. 프로그램 작성은 확실히 루비가 쉬웠지만 동작속도의 차이가 엄청나군요. 1.8에 비해 많이 빨라졌다는 1.9 버전도 scala에 비해서는 10배 가까운 차이가 나니까요. 동적인 자유로움을 추구하는 언어와 정적 타입을 가지고 컴파일하는 언어의 차이일까요. 앞으로 좀 더 다양한 상황에서 비교를 해 보아야 할것 같습니다. :( 그리고 루비 2.0에 도입된 lazy 구문을 사용해도 사용하지 않은 것과 속도차이가 크게 나지 않는 것은 아주 마음에 드는군요. :)

댓글

이 블로그의 인기 게시물

터미널에서 스칼라 파일 직접 컴파일, 실행

로잉 머신 운동 2달째

curses 라이브러리 간단한 정리