kiyokaのブログアーカイブ

Archive of old blog posts

Ruby 2.0(開発版)に入ったEnumerable::Lazyを試してみた(Nendo編)

2012-04-01Ruby*Nendo Ruby 2.0(開発版)に入ったEnumerable::Lazyを試してみた」の続き。 Ruby 2.0をビルドする手順は先日の記事を参照してほしい。 今日は、Nendoでも試してみた。 img もうひとつLazyな写真

[Nendo] 0.6.4でもそのままLazyの効果は出た。 そういえば、書き忘れていたが、Lazyは使用メモリを削減するだけじゃなくて、計算量も削減するのだった。実際に必要な分しか計算しない。 今回のサンプルプログラムでは、take 5 しているので、grepして見つかった最初の5行が見つかったところで計算を打ち切る。

Lazyの効果

実際に大きなサイズのtest.txtを用意した。

$ du -sh test.txt
58M	test.txt

* Lazyなし

$ time nendo ./lazy_sample.nnd 
*without Lazy*
ruby
ruby's
rubying
ruby
ruby's
=> VmPeak:	  428816 kB  (418MByte)
65.48user 0.43system 1:11.54elapsed 92%CPU (0avgtext+0avgdata 1572592maxresident)k

* Lazyあり

$ time nendo ./lazy_sample.nnd lazy
*with    Lazy*
ruby
ruby's
rubying
ruby
ruby's
=> VmPeak:	   65544 kB  ( 64MByte)
2.19user 0.04system 0:02.45elapsed 91%CPU (0avgtext+0avgdata 132704maxresident)k

メモリ消費量が減ったと同時にCPU消費も減ったことも確認できた。 すばらしい。

実験したソースコード

先日のRubyコードはリファクタリングして読みやすくした。 lazy_sample.rb sample for Enumerable::Lazy of Ruby 2.0 — Gist

Nendo版はRuby版と対比させやすいようなコーディングにしてあるので比較してみてほしい。 lazy_sample.scm Nendo sample for Enumerable::Lazy of Ruby 2.0 — Gist

感想

Nendoに変更を加えなくてもとりあえずLazyになった。素晴らしすぎるぜ。