Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rubyを30倍速くした話
Search
Tsukasa OISHI
February 21, 2018
Programming
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyを30倍速くした話
Tsukasa OISHI
February 21, 2018
More Decks by Tsukasa OISHI
See All by Tsukasa OISHI
怖くないメモリ肥大化
tsukasa_oishi
1
120
SLI/SLO をストリーム アラインドチームに導入した話
tsukasa_oishi
0
210
JITをたどるとそこはYARVの中
tsukasa_oishi
0
590
The Cacher in the Rye
tsukasa_oishi
1
6k
ISeqで遊ぼう
tsukasa_oishi
0
5.3k
はてブ砲をくらったときのお話
tsukasa_oishi
0
2.3k
食べログで動いている自作ライブラリのお話
tsukasa_oishi
0
320
奥さんとプログラミングを両立させる方法
tsukasa_oishi
0
110
MiyazakiResistanceを作ってみたよ
tsukasa_oishi
0
1.1k
Other Decks in Programming
See All in Programming
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
Claspは野良GASの夢をみるか
takter00
0
210
A2UI という光を覗いてみる
satohjohn
1
150
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
Oxlintのカスタムルールの現況
syumai
6
1.1k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
580
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
150
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
ふつうのFeature Flag実践入門
irof
8
4.2k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
160
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
BBQ
matthewcrist
89
10k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
170
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
230
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Documentation Writing (for coders)
carmenintech
77
5.4k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
450
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Transcript
3VCZΛഒ ͨ͘͠
͓͓͍͔ͭ͠͞ @tsukasaoishi (Github) https://www.kaeruspoon.net
ࠂ࡞ͬͯͶ ͋ɺҰिؒͰ
ཁ݅ ɾαΠτͷݕࡧը໘ʹग़͢ 17ߴ ɾҎʹө ɾ͘͠ͳ͍Ͱ
ࠂΛग़݅͢ ɾ݅ग़͢ ɾݕࡧ݅ʹϚονͨ͠ͷ ɾϚον͠ͳ͔ͬͨΒݕࡧ݅Λ ɹΏΔͯ͘͠·ͨ୳͢ ɾશવϚον͠ͳ͍߹࠷େͰ ɹճ୳͢͜ͱʹͳΔ
͍࣋ͬͯΔث ɾݕࡧΤϯδϯͳ͠ ɾ%#Ͱ4&-&$5
ࢼߦࡨޡͦͷ ;ͭ͏ʹຖճ4&-&$5
NTYճNT
NTYճNT
ࢼߦࡨޡͦͷ ͻͱͭͻͱͭͷ݅͝ͱʹ *%ͷू߹Λ࡞ͬͯ ੵू߹
QSFGT\UPLZP< >^ BSFBT\FCJTV< >^ HFOSFT\ZBLJOJLV< > DVSSZ<>^
౦ژɺܙൺणɺΧϨʔ͕ݕࡧ݅ͩͬͨ߹ QSFGT<UPLZP>BSFBT<FCJTV> QSFGT<UPLZP>BSFBT<FCJTV>HFOSFT<DVSSZ>
QSFGT\UPLZP< >^ BSFBT\FCJTV< >^ HFOSFT\ZBLJOJLV< > DVSSZ<>^
౦ژɺܙൺणɺΧϨʔ͕ݕࡧ݅ͩͬͨ߹ QSFGT<UPLZP>BSFBT<FCJTV> QSFGT<UPLZP>BSFBT<FCJTV>HFOSFT<DVSSZ> ͕݅݅ະຬʹͳͬͨ࣌ʹɺͻͱͭલͷू߹Λ͏
ສ݅ͷू߹ݸͷੵ
Benchmark.realtime do m & m & m & m &
m & m end
4FU
m = Set.new(1..1_000_000)
"SSBZ
m = (1..1_000_000).to_a
None
࠶ߟ ɾͷू߹͔͠ѻΘͳ͍ ɾੵू߹ͱϏοτԋࢉࣅ͍ͯΔ
BCDE B C D E
QSFGT\UPLZP< >^ BSFBT\FCJTV< >^ HFOSFT\ZBLJOJLV< > DVSSZ<>^
QSFGT\UPLZP^ BSFBT\FCJTV^ HFOSFT\ZBLJOJLV DVSSZ^
Ϗοτԋࢉίϯϐϡʔλಘҙ
ʙ ʙ
ʜ ेສθϩ͕ଓ͘ ʜ
ʜ ेສθϩ͕ଓ͘ ʜ ༿ϊʔυ;ͨͭͰදݱͰ͖Δ
ʙ ʙ
ʙ ʙ ༿ϊʔυ͕Ұக͠ͳ͍߹ Ϗοτԋࢉࣗମෆཁ
3VCZ$ݴޠͰॻ͔Ε͍ͯΔ
͓Ε3VCZΛΊΔͧ
typedef struct _leaf_node { unsigned long offset; unsigned long data;
} *leaf_node;
void Init_figure_set(void) { rb_cFigureSet = rb_define_class("FigureSet", rb_cObject); rb_define_alloc_func(rb_cFigureSet, t_allocate); rb_define_private_method(rb_cFigureSet,
"initialize", t_initialize, -1); rb_define_method(rb_cFigureSet, "initialize_copy", t_initialize_copy, 1); rb_define_method(rb_cFigureSet, "add", t_add, 1); rb_define_method(rb_cFigureSet, "delete", t_delete, 1); rb_define_method(rb_cFigureSet, "intersection", t_intersection, 1); ΠϯλʔϑΣʔε3VCZͩΑ
Benchmark.realtime do m & m & m & m &
m & m end
'JHVSF4FU
m = FigureSet.new((1..1_000_000).to_a)
None
require "figure_set" require "benchmark/ips" m3 = [] m5 = []
(1..1_000_000).each do |i| m3 << i if i % 3 == 0 m5 << i if i % 5 == 0 end s_m3 = Set.new(m3) s_m5 = Set.new(m5) f_m3 = FigureSet.new(m3) f_m5 = FigureSet.new(m5) Benchmark.ips do |x| x.report("arry") { m3 & m5 } x.report("set") { s_m3 & s_m5 } x.report("figure_set") { f_m3 & f_m5 } x.compare! end
figure_set: 1069.1 i/s arry: 31.1 i/s - 34.34x slower set:
13.6 i/s - 78.68x slower
͓͠·͍