SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なことメモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
Masaya TARUI
 
mrubyのfiberを試してみた
mrubyのfiberを試してみたmrubyのfiberを試してみた
mrubyのfiberを試してみた
Kindai University
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
nekogeruge_987
 
Ruby on Rails での開発で使って良いなと思ったメソッド
Ruby on Rails での開発で使って良いなと思ったメソッドRuby on Rails での開発で使って良いなと思ったメソッド
Ruby on Rails での開発で使って良いなと思ったメソッド
107steps
 
TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試み
Hiroki Mizuno
 
デスクトップでのRuby活用事例
デスクトップでのRuby活用事例デスクトップでのRuby活用事例
デスクトップでのRuby活用事例
Yoshiyuki MIKAMI
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
Narihiro Nakamura
 
Grunt task Unite-Coffee
Grunt task Unite-CoffeeGrunt task Unite-Coffee
Grunt task Unite-Coffee
minoru nakanou
 

Was ist angesagt? (20)

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

Andere mochten auch

Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)Rubyのソースコードを読んでみよう(入門編)
Rubyのソースコードを読んでみよう(入門編)
baban ba-n
 
[120517]自己紹介
[120517]自己紹介[120517]自己紹介
[120517]自己紹介
Takahiro Yano
 
曲面レイトレ入門
曲面レイトレ入門曲面レイトレ入門
曲面レイトレ入門
Toru Matsuoka
 

Andere mochten auch (20)

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

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