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
The future of Ruby is faster
Search
Dirkjan Bussink
June 29, 2013
Technology
3
540
The future of Ruby is faster
Talk given at Euruko 2013
Dirkjan Bussink
June 29, 2013
Tweet
Share
More Decks by Dirkjan Bussink
See All by Dirkjan Bussink
Managing a widely distributed team
dbussink
1
170
Time
dbussink
0
110
The tricky truth about parallel execution and modern hardware
dbussink
0
340
Security for dummies
dbussink
1
150
The myth of dynamic language performance
dbussink
3
440
Rubinius - Tales from the trenches @ Railsclub.ru 2012
dbussink
2
210
Rubinius - Tales from the trenches @ Baruco 2012
dbussink
1
260
Rubinius Eurucamp 2012 Workshop
dbussink
2
120
Rubinius Euruko 2012 Lightning talk
dbussink
2
240
Other Decks in Technology
See All in Technology
Infrastructure as Prompt実装記 〜Bedrock AgentCoreで作る自然言語インフラエージェント〜
yusukeshimizu
1
130
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
6.3k
バクラクによるコーポレート業務の自動運転 #BetAIDay
layerx
PRO
1
970
家族の思い出を形にする 〜 1秒動画の生成を支えるインフラアーキテクチャ
ojima_h
3
1.2k
人に寄り添うAIエージェントとアーキテクチャ #BetAIDay
layerx
PRO
10
2.3k
Google Agentspaceを実際に導入した効果と今後の展望
mixi_engineers
PRO
3
720
Claude CodeでKiroの仕様駆動開発を実現させるには...
gotalab555
3
1.1k
リリース2ヶ月で収益化した話
kent_code3
1
300
「Roblox」の開発環境とその効率化 ~DAU9700万人超の巨大プラットフォームの開発 事始め~
keitatanji
0
130
全員が手を動かす組織へ - 生成AIが変えるTVerの開発現場 / everyone-codes-genai-transforms-tver-development
tohae
0
200
Amazon Bedrock AgentCoreのフロントエンドを探す旅 (Next.js編)
kmiya84377
1
150
いかにして命令の入れ替わりについて心配するのをやめ、メモリモデルを愛するようになったか(改)
nullpo_head
7
2.6k
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
880
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Practical Orchestrator
shlominoach
190
11k
Gamification - CAS2011
davidbonilla
81
5.4k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
A designer walks into a library…
pauljervisheath
207
24k
Faster Mobile Websites
deanohume
308
31k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
Become a Pro
speakerdeck
PRO
29
5.5k
Transcript
The future of Ruby is faster Euruko 2013 Saturday, June
29, 13
Dirkjan Bussink @dbussink Saturday, June 29, 13
Rubinius Use Ruby Saturday, June 29, 13
Saturday, June 29, 13
Saturday, June 29, 13
“Everything you heard about Ruby being slow is not true.
It’s about twice as slow as that” Saturday, June 29, 13
Saturday, June 29, 13
The lure of the hash table Saturday, June 29, 13
class MethodTable def initialize @methods = {} end def store_method(name,
code) @methods[name] = code end def find_method(name) @methods[name] end end Saturday, June 29, 13
class Address def initialize @instance_variables[:street] = "Pantheon" @instance_variables[:number] = 1
@instance_variables[:city] = "Athens" end end Saturday, June 29, 13
Hash tables everywhere! Saturday, June 29, 13
Inline caching Saturday, June 29, 13
p = Person.new p.name Saturday, June 29, 13
p = Person.new p.name <receiver_class_id, code> Saturday, June 29, 13
“There are 2 hard problems in computer science: caching, naming,
and off-by-1 errors” Saturday, June 29, 13
Global serial number Saturday, June 29, 13
http://jamesgolick.com/2013/4/14/mris-method-caches.html https://charlie.bz/blog/things-that-clear-rubys-method-cache Saturday, June 29, 13
Per class serial number Saturday, June 29, 13
Probably in 2.1 Saturday, June 29, 13
Instance variable packing Saturday, June 29, 13
class Address def initialize @street = "Pantheon" @number = 1
@city = "Athens" end end Address.instance_variable_get("@seen_ivars") => [:@street, :@number, :@city] Saturday, June 29, 13
0001: push_ivar :@number self[1] Removes hash table lookup Saturday, June
29, 13
Just in time compilation Saturday, June 29, 13
def method1 1 + method2 end def method2 2 +
1 end 100000.times do method1 end Saturday, June 29, 13
def method1 1 + method2 end def method2 2 +
1 end 100000.times do method1 end ... 0x110ed90e7 mov $0x9, %eax 0x110ed90ec jmp 0x119 ; 0x110ed9129 ... 0x110ed9129 addq $0xa0, %rsp 0x110ed9130 pop %rbp 0x110ed9131 ret Saturday, June 29, 13
def method1 1 + method2 end def method2 2 +
1 end 100000.times do method1 end ... 0x110ed90e7 mov $0x9, %eax 0x110ed90ec jmp 0x119 ; 0x110ed9129 ... 0x110ed9129 addq $0xa0, %rsp 0x110ed9130 pop %rbp 0x110ed9131 ret b0100 (4) b1000 (8) b1001 (9) Saturday, June 29, 13
def method1 1 + method2 end def method2 2 +
1 end 100000.times do method1 end ... 0x110ed90e7 mov $0x9, %eax 0x110ed90ec jmp 0x119 ; 0x110ed9129 ... 0x110ed9129 addq $0xa0, %rsp 0x110ed9130 pop %rbp 0x110ed9131 ret b0100 (4) b1000 (8) b1001 (9) Saturday, June 29, 13
Saturday, June 29, 13
Creating less garbage Saturday, June 29, 13
a = Address.new a.street = "Pantheon" a.number = "1" a.city
= "Athens" Rubinius.memory_size(a) => 56 VS Rubinius.memory_size(a) => 160 Saturday, June 29, 13
Saturday, June 29, 13
2.1 Saturday, June 29, 13
Auto tuning Saturday, June 29, 13
Parallelism Saturday, June 29, 13
Higher throughput Saturday, June 29, 13
Concurrency Saturday, June 29, 13
Shorter stop the world Saturday, June 29, 13
thread 1 thread 2 thread 3 Saturday, June 29, 13
thread 1 thread 2 thread 3 GC thread Saturday, June
29, 13
thread 1 thread 2 thread 3 GC thread Long GC
pauses be gone! Saturday, June 29, 13
http://rubini.us/2013/06/22/concurrent-garbage-collection/ Saturday, June 29, 13
How much does it help? Saturday, June 29, 13
Before Saturday, June 29, 13
Lifting the server siege... done. Transactions: 501 hits Response time:
0.02 secs Transaction rate: 51.70 trans/sec Throughput: 1.46 MB/sec Concurrency: 1.00 Longest transaction: 0.15 Shortest transaction: 0.01 Saturday, June 29, 13
Lifting the server siege... done. Transactions: 501 hits Response time:
0.02 secs Transaction rate: 51.70 trans/sec Throughput: 1.46 MB/sec Concurrency: 1.00 Longest transaction: 0.15 Shortest transaction: 0.01 Sad long wait time :( Saturday, June 29, 13
Lifting the server siege... done. Transactions: 1032 hits Response time:
0.04 secs Transaction rate: 102.79 trans/sec Throughput: 2.91 MB/sec Concurrency: 4.00 Longest transaction: 0.28 Shortest transaction: 0.02 Saturday, June 29, 13
Lifting the server siege... done. Transactions: 1032 hits Response time:
0.04 secs Transaction rate: 102.79 trans/sec Throughput: 2.91 MB/sec Concurrency: 4.00 Longest transaction: 0.28 Shortest transaction: 0.02 Not so good concurrency Saturday, June 29, 13
After Saturday, June 29, 13
Lifting the server siege... done. Transactions: 599 hits Response time:
0.02 secs Transaction rate: 61.06 trans/sec Throughput: 1.73 MB/sec Concurrency: 1.00 Longest transaction: 0.03 Shortest transaction: 0.01 Saturday, June 29, 13
Lifting the server siege... done. Transactions: 599 hits Response time:
0.02 secs Transaction rate: 61.06 trans/sec Throughput: 1.73 MB/sec Concurrency: 1.00 Longest transaction: 0.03 Shortest transaction: 0.01 No more long pause! Saturday, June 29, 13
Lifting the server siege... done. Transactions: 1374 hits Response time:
0.02 secs Transaction rate: 176.38 trans/sec Throughput: 5.00 MB/sec Concurrency: 3.99 Longest transaction: 0.04 Shortest transaction: 0.01 Saturday, June 29, 13
Lifting the server siege... done. Transactions: 1374 hits Response time:
0.02 secs Transaction rate: 176.38 trans/sec Throughput: 5.00 MB/sec Concurrency: 3.99 Longest transaction: 0.04 Shortest transaction: 0.01 More req/s! Saturday, June 29, 13
1 client: 51 => 61 req/s 4 clients: 102 =>
176 req/s Saturday, June 29, 13
Concurrency & parallelism Saturday, June 29, 13
No GIL/GVL! Saturday, June 29, 13
Future is multi-core Saturday, June 29, 13
We need new API’s Saturday, June 29, 13
Parallel each Saturday, June 29, 13
Thread safe collections Saturday, June 29, 13
What about you as a developer? Saturday, June 29, 13
Be nice Saturday, June 29, 13
Write type stable code Saturday, June 29, 13
Small and simple methods Saturday, June 29, 13
Benchmark! Saturday, June 29, 13
? Saturday, June 29, 13