stm | |
すっかり夏休み風にとんでしまってるまいにち Ruby だけどめげない。
Ruby で Software Transactional Memory を実装してみる。
mootoh’s ruby-stm at master - GitHub
まだつくっている途中。雰囲気が伝わるかな。
こんなコードで、
Beautiful Code の例を書けるようになるだろう。
あわせてよみたい:
steps to phantasien 2007-06-23 つくってわか(った気にな)る STM
ctmcp | |
CTMCP 1.7 章にあるメモ化というか計算結果のキャッシュをつかうと、 Ruby で書いたものも実用的に速くなる。
Scheme 版:
pascal(100) の実行時間:
| ruby 1.8.6 | ruby 1.9.2dev | MacRuby 0.5 | macrubyc 0.5 compiled a.out | gosh 0.8.13 |
| 0.059s | 0.035s | 0.968s | コンパイルできず >< | 0.009s |
Gauche つよい。
ctmcp | |
ネタに困るので、CTMCP の Oz コードをむりやり Ruby で書きながら学習してみるの図。
リスト処理、パターンマッチングを Array でやるあたりに無理がある。car, cdr, cons を pop, flatten でやってるのでオブジェクト生成が過剰。
性能を見る。Pascal(20) を time で測定 @ Mac OS X 10.5.7 on C2D 2.93GHz:
| ruby 1.8.6 | ruby 1.9.2dev | macruby 0.5 | macrubyc 0.5 でコンパイルした a.out |
| 6.66s | 4.5s | 58.38s | 57.024s |
リスト処理なら Lisp 系ですわなー、ということで Scheme で書いたものが以下。
性能:
gosh 0.8.13 → 0.577s
参考までにオリジナルの Oz コード:
これもまた、{Browse {Pascal 20}} に要する時間はほとんどなし。(Mozart 環境で実行時間を計測する方法をまだ知らない)
いつも
hoge = []
fuga = {}
ARGF.each do |line|
# line を parse して
# hoge とか fuga につっこんだり
end
# hoge とか fuga を解析
みたいにしてしまうんだよな。
ループのなかで hoge fuga 解析までやってしまいたいんだけどすっきりと書けない。
ガッツがたりないので、 FizzBuzz 書いてお茶をにごす。
# fizzbuzz.rb def fizzbuzz(n) def fizzbuzz_str(m) if m % 15 == 0 "fizzbuzz\n" elsif m % 3 == 0 'fizz ' elsif m % 5 == 0 'buzz ' else m.to_s + ' ' end end (1..n).each do |i| print fizzbuzz_str(i) end puts end fizzbuzz(100)
% ruby fizzbuzz.rb 1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz
% time "writing fizzbuzz.rb" 10m
macruby | |
a.rb:
% cat a.rb p 1 + 1
time macrubyc a.rb macrubyc a.rb 2.05s user 0.27s system 85% cpu 2.714 total
ちょっと時間かかるかんじ。
ls -l a.out -rwxr-xr-x 1 mootoh staff 14311192 Jul 23 01:39 a.out
14MB。でか。
otool -L しても LLVM 関係のが出てこないので、 LLVM のライブラリが static link されてる雰囲気をうけた。
file a.out a.out: Mach-O 64-bit executable x86_64
64bit バイナリ ktkr。
あとは
otool -tv a.out | grep ':$' | c++filt
とかするとたのしい。
takuma1042009/07/23 02:38macrubyc -o hoge.rb すると出る hoge.o が、LLVMで生成されたものっぽいのですが、そのサイズは普通で、それ以外の巨大な領域は libmacruby-static.a とかっぽいですな。
moira2009/07/23 07:03ほうほう。そうか、 macruby のランタイムシステムそのものが静的リンクされるわけですね。