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

PDF
slackに箇条書きにしたタスクを、Notionに登録してくれるbotを作った話
PPTX
BOOTがぶっとんだ
PDF
Rubyと機械学習の現状
PDF
PDF
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
PDF
NetworkXによる語彙ネットワークの可視化
PDF
Gitを使ったRoute53の管理
PDF
Meguro.rb#3LT「Ruby入門書を書いてて得られた知見5選+3α」
slackに箇条書きにしたタスクを、Notionに登録してくれるbotを作った話
BOOTがぶっとんだ
Rubyと機械学習の現状
明日使える超高速Ruby - RXbyak (Mitaka.rb #5)
NetworkXによる語彙ネットワークの可視化
Gitを使ったRoute53の管理
Meguro.rb#3LT「Ruby入門書を書いてて得られた知見5選+3α」

What's hot (20)

PDF
メモリアロケーションからみた拡張ライブラリに大切なこと
PDF
mrubyのfiberを試してみた
PDF
レガシーシステムのDBマイグレーションし始めた話
PDF
Pythonすいーつ部
ODP
計算数学
PPTX
Ruby on Rails での開発で使って良いなと思ったメソッド
PDF
TypeSafe OSの試み
PDF
俺とDockerとtDiaryとkubernetes
PPTX
Crystal勉強会#4 LT資料
PPTX
Alt2017 1111 hatobus
PPT
デスクトップでのRuby活用事例
PDF
Railsハイパー実践講座-第35回NaCl勉強会
PDF
78tch
PDF
Crucible @ M3, Inc.
PDF
社内Lt
PDF
MmapScanner
PDF
Grunt task Unite-Coffee
PPTX
Ruby と C# をつなぐ
PPTX
当番をランダムに割り当ててみる ~ on-dutyTable.py ~
PPTX
シェル芸で使いたくてLINQが使えるコマンドを作ったらawkでよかった話
メモリアロケーションからみた拡張ライブラリに大切なこと
mrubyのfiberを試してみた
レガシーシステムのDBマイグレーションし始めた話
Pythonすいーつ部
計算数学
Ruby on Rails での開発で使って良いなと思ったメソッド
TypeSafe OSの試み
俺とDockerとtDiaryとkubernetes
Crystal勉強会#4 LT資料
Alt2017 1111 hatobus
デスクトップでのRuby活用事例
Railsハイパー実践講座-第35回NaCl勉強会
78tch
Crucible @ M3, Inc.
社内Lt
MmapScanner
Grunt task Unite-Coffee
Ruby と C# をつなぐ
当番をランダムに割り当ててみる ~ on-dutyTable.py ~
シェル芸で使いたくてLINQが使えるコマンドを作ったらawkでよかった話
Ad

Viewers also liked (20)

PDF
シェーダだけで世界を創る!three.jsによるレイマーチング
PDF
スマホにおけるWebGL入門
PDF
WebGLことはじめ
ODP
Rubyのソースコードを読んでみよう(入門編)
PDF
Immutable List Gem (KLab ALM版)
PDF
[120517]自己紹介
PDF
Twitter名刺ジェネレータ
PDF
three.js の紹介
ODP
名刺の作り方(+α)
PDF
データに隠れた構造を推定して予測に活かす 〜行列分解とそのテストスコアデータへの応用〜
PPTX
チョコ溶かす奴
PDF
子どもがOculusダメな理由を調べてみた
PDF
Three.jsで3D気分
PDF
Oh! java script 夢の続きを語ろうよ〜emscriptenの逆襲
PPTX
パノラマ動画VR再生のあれこれ
PPT
曲面レイトレ入門
PDF
Yahoo150522
PDF
レイトレ合宿4!? 実装紹介スライド
PDF
楽しいShaderToy
PDF
Grimoire.js Community announcement June 20 2016
シェーダだけで世界を創る!three.jsによるレイマーチング
スマホにおけるWebGL入門
WebGLことはじめ
Rubyのソースコードを読んでみよう(入門編)
Immutable List Gem (KLab ALM版)
[120517]自己紹介
Twitter名刺ジェネレータ
three.js の紹介
名刺の作り方(+α)
データに隠れた構造を推定して予測に活かす 〜行列分解とそのテストスコアデータへの応用〜
チョコ溶かす奴
子どもがOculusダメな理由を調べてみた
Three.jsで3D気分
Oh! java script 夢の続きを語ろうよ〜emscriptenの逆襲
パノラマ動画VR再生のあれこれ
曲面レイトレ入門
Yahoo150522
レイトレ合宿4!? 実装紹介スライド
楽しいShaderToy
Grimoire.js Community announcement June 20 2016
Ad

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