Diary

Diary?

学生の研究日記だったらしいです。多分。

開発日記。

オススメの本(頂いた本):

いちばんあたらしいの2016 7/2 1:35

_1(Fri)

絶対どっかにありそうだけど、ベンチマーク用関数 fib_m() を考えてみた。

  • fib_m(0 or 1) = 1
  • fib_m(n) = fib_m(n-1) * fib_m(n-2)

Sak 関数と呼んで下さい。 (いや、絶対誰か考えてるだろうけど...)

つまり、結果は 1 にしかならないので、Bignum の計算が不要になる。

ちょっと試してみた。

# Ruby
def fib_m n
  case n
  when 0, 1
    1
  else
    fib_m(n-1) * fib_m(n-2)
  end
end

fib_m(40)

=begin
2.4 trunk
real    0m18.688s
user    0m18.647s
sys     0m0.016s

手元の trunk

real    0m17.245s
user    0m17.192s
sys     0m0.028s
=end

手元のビルド、ちょっとだけ改善が見られる。

# JRuby

$ jruby -v
jruby 9.0.3.0 (2.2.2) 2015-10-21 633c9aa OpenJDK 64-Bit Server VM 24.95-b01 on 1.7.0_101-b00 +jit [linux-amd64]

$ time jruby ~/src/rb/t.rb

real    0m19.053s
user    0m18.294s
sys     0m2.732s

ちょっと古いので、新しい奴はもっと速いと思う。

# Elixir

defmodule FibM do
  def fib_m 0 do
    1
  end
  def fib_m 1 do
    1
  end
  def fib_m n do
    fib_m(n-1) * fib_m(n-2)
  end
end

FibM.fib_m(40)

'''
$ time elixir lib/fib_m.ex

real    0m7.797s
user    0m0.270s
sys     0m7.555s
'''

BEAM VM 速いね...。

# C

int fib_m(n)
{
    if (n == 0 || n == 1) {
	return 1;
    }
    else {
	return fib_m(n-1) * fib_m(n-2);
    }
}

main(){
    fib_m(40);
}

/*
$ gcc fib_m.c
$ time ./a.out

real    0m0.912s
user    0m0.905s
sys     0m0.004s

$ gcc -O3 fib_m.c
$ time ./a.out

real    0m0.262s
user    0m0.252s
sys     0m0.008s
*/

なんというか、起動時間が大勢を占めているっぽい。-O3 で残ってるんか? 見てみたら一応、残っていた。というか、凄い展開されてる。

# Python

def fib_m(n):
    if n == 0:
        return 1
    elif n == 1:
        return 1
    else:
        return fib_m(n-1) * fib_m(n-2)

fib_m(40)

$ python --version ~/src/py/fib_m.py
Python 2.7.6

$ time python ~/src/py/fib_m.py

real    0m38.784s
user    0m38.733s
sys     0m0.028s

$ python3 --version
Python 3.4.3

$ time python3  ~/src/py/fib_m.py

real    0m42.571s
user    0m42.540s
sys     0m0.012s

意外と遅い。

# Crystal 0.18.6 [204bfd0] (2016-06-28)

def fib_m(n)
  case n
  when 0, 1
    1
  else
    fib_m(n-1) * fib_m(n-2)
  end
end

fib_m(40)

$ crystal -v
Crystal 0.18.6 [204bfd0] (2016-06-28)

$ time crystal fib_m.cr

real    0m3.231s
user    0m2.251s
sys     0m1.053s

はえー。

# scheme (Gauche)

(define (fib_m n)
        (cond ((= n 0) 1)
              ((= n 1) 1)
              (else (* (fib_m (- n 1))
                       (fib_m (- n 2))))))
(fib_m 40)

$ gosh -V
Gauche scheme shell, version 0.9.3.3 [utf-8,pthreads], x86_64-unknown-linux-gnu

$ time gosh ~/src/scheme/fib_m.scm

real    0m15.085s
user    0m14.982s
sys     0m0.080s

計ってるのは関数呼び出しのコストだから、アルゴリズム替えろよ、とかは無しで。


というわけで、主要 n 言語でした(嘘)。

_よしき(Sat Jul 02 01:35:39 +0900 2016)

 これはSqueak圧勝の予感..

Log

2002 01 02 03 04 05 06 07 08 09 10 11 12
2003 01 02 03 04 05 06 07 08 09 10 11 12
2004 01 02 03 04 05 06 07 08 09 10 11 12
2005 01 02 03 04 05 06 07 08 09 10 11 12
2006 01 02 03 04 05 06 07 08 09 10 11 12
2007 01 02 03 04 05 06 07 08 09 10 11 12
2008 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 03 04 05 06 07 08 09 10 11 12
2010 01 02 03 04 05 06 07 08 09 10 11 12
2011 01 02 03 04 05 06 07 08 09 10 11 12
2012 01 02 03 04 05 06 07 08 09 10 11 12
2013 01 02 03 04 05 06 07 08 09 10 11 12
2014 01 02 03 04 05 06 07 08 09 10 11 12
2015 01 02 03 04 05 06 07 08 09 10 11 12
2016 01 02 03 04 05 06 07 08 09 10 11 12

SASADA Koichi (ko1 at atdot dot net) / Skype ID: ko1_ssd


rss