狠狠撸

狠狠撸Share a Scribd company logo
Rubyで連結リスト使うための
gemを作った
@gam0022
自己紹介

Twitter: @gam0022
情報科学類3年(coins11)
@daigoroubot の飼い主
COJT SWコース
Ruby と C#
けっこうなんでも書きます
作った動機

Rubyでオーバーヘッドを気にせずに
再帰プログラミングをしたかった。
(情報特別講義の課題)
Rubyで再帰プログラミング
Ruby の Array は 配列で実装されている。

遅い + メモリを消費する

次の操作が

先頭への要素の追加(cons)
連結(append)
push などが破壊的操作

再帰プログラミングをするのには致命的
なんとかしたい

リストのデータ構造を自分で作ってみた!
ImmutableList
ImmutableList
特徴
単方向連結リスト(singly-circularly-linked list)
非破壊的(immutable)
Cで実装 (C Extensions)
Rubyで実装すると、オーバーヘッドが多すぎる
RubyGemsでは、Cで実装されたLinkedListは見つから
なかった
ImmutableList
OCaml を意識したメソッド
cons
head, tail
rev_append, rev, append
length
nth
Basic
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
メモリ効率の良さ
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
メモリ効率の良さ
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
Quick Sort とは
クイックソート
一般的に最も高速なソート O(n log n)、安定ソートではない
アルゴリズム
1. 適当に数(ピポット)を選ぶ
2. ピポットより小さい数を前方、大きい数を後方に分割
3. 2分割されたデータで更に繰り返す
Quick Sort 素朴な実装

tempとか実装上の都合
の変数が多い (#? ?)
プログラムの動作が追い
にくい (#? ?)
読みにくい (#? ?)
Quick Sort 再帰版
RubyGemsで公開中

RubyGemとは
Rubyのライブラリのパッケージ管理システム
Install
コマンド一発で導入可能
ご静聴ありがとうございました

詳しい話はブログで
「ruby immutable_list」で検索
http://gam0022.net/blog/2013/10/22/immutablelist-gem/
http://gam0022.net/blog/2013/10/18/gems-withextensions/
余談

RubyのC拡張は作りやすさは素晴らしい。
しかし、デメリットもある。
Rubyを改良するための大きな変更がしたいときに、C拡張
が足を引っ張る。
効率の良いGCを取り入れたいが、それまでのライブラリが
使えなくなる。
RGenGC
GCは重い処理。
現状のRubyは mark&sweep 方式(全探索で遅い)
Ruby 2.1 では世代別GCが採用予定
RGecGC
過去のC拡張の互換性を保ちつつ高速化
http://www.atdot.net/ ko1/activities/
RubyKaigi2013-ko1.pdf

More Related Content

搁耻产测で连结リスト使うための驳别尘を作った(迟蝉耻办耻产补.谤产版)