Slide 1

Slide 1 text

The future of Ruby is faster Euruko 2013 Saturday, June 29, 13

Slide 2

Slide 2 text

Dirkjan Bussink @dbussink Saturday, June 29, 13

Slide 3

Slide 3 text

Rubinius Use Ruby Saturday, June 29, 13

Slide 4

Slide 4 text

Saturday, June 29, 13

Slide 5

Slide 5 text

Saturday, June 29, 13

Slide 6

Slide 6 text

“Everything you heard about Ruby being slow is not true. It’s about twice as slow as that” Saturday, June 29, 13

Slide 7

Slide 7 text

Saturday, June 29, 13

Slide 8

Slide 8 text

The lure of the hash table Saturday, June 29, 13

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

class Address def initialize @instance_variables[:street] = "Pantheon" @instance_variables[:number] = 1 @instance_variables[:city] = "Athens" end end Saturday, June 29, 13

Slide 11

Slide 11 text

Hash tables everywhere! Saturday, June 29, 13

Slide 12

Slide 12 text

Inline caching Saturday, June 29, 13

Slide 13

Slide 13 text

p = Person.new p.name Saturday, June 29, 13

Slide 14

Slide 14 text

p = Person.new p.name Saturday, June 29, 13

Slide 15

Slide 15 text

“There are 2 hard problems in computer science: caching, naming, and off-by-1 errors” Saturday, June 29, 13

Slide 16

Slide 16 text

Global serial number Saturday, June 29, 13

Slide 17

Slide 17 text

http://jamesgolick.com/2013/4/14/mris-method-caches.html https://charlie.bz/blog/things-that-clear-rubys-method-cache Saturday, June 29, 13

Slide 18

Slide 18 text

Per class serial number Saturday, June 29, 13

Slide 19

Slide 19 text

Probably in 2.1 Saturday, June 29, 13

Slide 20

Slide 20 text

Instance variable packing Saturday, June 29, 13

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

0001: push_ivar :@number self[1] Removes hash table lookup Saturday, June 29, 13

Slide 23

Slide 23 text

Just in time compilation Saturday, June 29, 13

Slide 24

Slide 24 text

def method1 1 + method2 end def method2 2 + 1 end 100000.times do method1 end Saturday, June 29, 13

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Saturday, June 29, 13

Slide 29

Slide 29 text

Creating less garbage Saturday, June 29, 13

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Saturday, June 29, 13

Slide 32

Slide 32 text

2.1 Saturday, June 29, 13

Slide 33

Slide 33 text

Auto tuning Saturday, June 29, 13

Slide 34

Slide 34 text

Parallelism Saturday, June 29, 13

Slide 35

Slide 35 text

Higher throughput Saturday, June 29, 13

Slide 36

Slide 36 text

Concurrency Saturday, June 29, 13

Slide 37

Slide 37 text

Shorter stop the world Saturday, June 29, 13

Slide 38

Slide 38 text

thread 1 thread 2 thread 3 Saturday, June 29, 13

Slide 39

Slide 39 text

thread 1 thread 2 thread 3 GC thread Saturday, June 29, 13

Slide 40

Slide 40 text

thread 1 thread 2 thread 3 GC thread Long GC pauses be gone! Saturday, June 29, 13

Slide 41

Slide 41 text

http://rubini.us/2013/06/22/concurrent-garbage-collection/ Saturday, June 29, 13

Slide 42

Slide 42 text

How much does it help? Saturday, June 29, 13

Slide 43

Slide 43 text

Before Saturday, June 29, 13

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

After Saturday, June 29, 13

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

1 client: 51 => 61 req/s 4 clients: 102 => 176 req/s Saturday, June 29, 13

Slide 54

Slide 54 text

Concurrency & parallelism Saturday, June 29, 13

Slide 55

Slide 55 text

No GIL/GVL! Saturday, June 29, 13

Slide 56

Slide 56 text

Future is multi-core Saturday, June 29, 13

Slide 57

Slide 57 text

We need new API’s Saturday, June 29, 13

Slide 58

Slide 58 text

Parallel each Saturday, June 29, 13

Slide 59

Slide 59 text

Thread safe collections Saturday, June 29, 13

Slide 60

Slide 60 text

What about you as a developer? Saturday, June 29, 13

Slide 61

Slide 61 text

Be nice Saturday, June 29, 13

Slide 62

Slide 62 text

Write type stable code Saturday, June 29, 13

Slide 63

Slide 63 text

Small and simple methods Saturday, June 29, 13

Slide 64

Slide 64 text

Benchmark! Saturday, June 29, 13

Slide 65

Slide 65 text

? Saturday, June 29, 13