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
220
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
330
奥さんとプログラミングを両立させる方法
tsukasa_oishi
0
110
MiyazakiResistanceを作ってみたよ
tsukasa_oishi
0
1.1k
Other Decks in Programming
See All in Programming
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
570
アクセシビリティから考える情報設計
high_g_engineer
0
260
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
420
業務時間外もAIに働いてもらう話
colorful12
3
10k
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
140
Foundry Localでエージェント開発
seosoft
0
140
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
110
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
340
ALB ログから Trace を気合で繋げる技術
fohte
7
880
AIの中の人になってみる
htkym
0
170
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
290
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
710
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
How GitHub (no longer) Works
holman
316
150k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
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
͓͠·͍