Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)

4,215 views

Published on

2013/12/12 のTsukuba.rb の発表資料です。

  • Be the first to comment

Rubyで連結リスト使うためのgemを作った(tsukuba.rb版)

  1. 1. Rubyで連結リスト使うための gemを作った @gam0022
  2. 2. 自己紹介 Twitter: @gam0022 情報科学類3年(coins11) @daigoroubot の飼い主 COJT SWコース Ruby と C# けっこうなんでも書きます
  3. 3. 作った動機 Rubyでオーバーヘッドを気にせずに 再帰プログラミングをしたかった。 (情報特別講義の課題)
  4. 4. Rubyで再帰プログラミング Ruby の Array は 配列で実装されている。 遅い + メモリを消費する 次の操作が 先頭への要素の追加(cons) 連結(append) push などが破壊的操作 再帰プログラミングをするのには致命的
  5. 5. なんとかしたい リストのデータ構造を自分で作ってみた! ImmutableList
  6. 6. ImmutableList 特徴 単方向連結リスト(singly-circularly-linked list) 非破壊的(immutable) Cで実装 (C Extensions) Rubyで実装すると、オーバーヘッドが多すぎる RubyGemsでは、Cで実装されたLinkedListは見つから なかった
  7. 7. ImmutableList OCaml を意識したメソッド cons head, tail rev_append, rev, append length nth
  8. 8. Basic
  9. 9. Benchmark 先頭に長さ3のリストを連結するのにかかった秒数 連結回数 Array ImmutableList 10 1.5E-05 2E-05 1000 0.007251 0.00166 10000 0.727542 0.015206 100000 102.080825 0.414083
  10. 10. メモリ効率の良さ Arrayの連結(C = A + B) : メモリの使用量が2倍 B A 1 2 3 + 1 2 3 4 4 6 5 8 7 C 5 6 7 8 4 5 6 7 B A 1 2 3 8
  11. 11. メモリ効率の良さ ImutableListの連結(C = A + B): BとCはメモリを共有 B A 1 3 2 + 4 6 5 7 8 C 1 2 3 B A 1 2 3 4 5 6 7 8
  12. 12. Quick Sort とは クイックソート 一般的に最も高速なソート O(n log n)、安定ソートではない アルゴリズム 1. 適当に数(ピポット)を選ぶ 2. ピポットより小さい数を前方、大きい数を後方に分割 3. 2分割されたデータで更に繰り返す
  13. 13. Quick Sort 素朴な実装 tempとか実装上の都合 の変数が多い (#・ ・) プログラムの動作が追い にくい (#・ ・) 読みにくい (#・ ・)
  14. 14. Quick Sort 再帰版
  15. 15. RubyGemsで公開中 RubyGemとは Rubyのライブラリのパッケージ管理システム
  16. 16. Install コマンド一発で導入可能
  17. 17. ご静聴ありがとうございました 詳しい話はブログで 「ruby immutable_list」で検索 http://gam0022.net/blog/2013/10/22/immutablelist-gem/ http://gam0022.net/blog/2013/10/18/gems-withextensions/
  18. 18. 余談 RubyのC拡張は作りやすさは素晴らしい。 しかし、デメリットもある。 Rubyを改良するための大きな変更がしたいときに、C拡張 が足を引っ張る。 効率の良いGCを取り入れたいが、それまでのライブラリが 使えなくなる。
  19. 19. RGenGC GCは重い処理。 現状のRubyは mark&sweep 方式(全探索で遅い) Ruby 2.1 では世代別GCが採用予定 RGecGC 過去のC拡張の互換性を保ちつつ高速化 http://www.atdot.net/ ko1/activities/ RubyKaigi2013-ko1.pdf

×