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
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
670
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
580
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
150
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
500
act2-costs.pdf
sumedhbala
0
120
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.8k
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
110
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
990
Performance Engineering for Everyone
elenatanasoiu
0
270
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
290
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
220
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
500
Typedesign – Prime Four
hannesfritz
42
3.1k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
260
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
210
Leo the Paperboy
mayatellez
8
1.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Side Projects
sachag
455
43k
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
͓͠·͍