Slide 1

Slide 1 text

The myth of dynamic language performance DevConTLV

Slide 2

Slide 2 text

Dirkjan Bussink @dbussink

Slide 3

Slide 3 text

Rubinius A Ruby implementation

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

“PHP too slow for Facebook, builds its own faster version” “Everything you heard about Ruby being slow is not true. It’s about twice as slow as that” “How JavaScript is Slowing Down the Web” 2006

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

Static vs. Dynamic

Slide 10

Slide 10 text

Weak vs. Strong

Slide 11

Slide 11 text

C PHP Java Ruby Static Dynamic Weak Strong

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

The lure of the hash table

Slide 14

Slide 14 text

class MethodTable def initialize @methods = {} end def store_method(name, code) @methods[name] = code end def find_method(name) @methods[name] end end

Slide 15

Slide 15 text

class Address { private String street; private Integer number; private String city; public Address(String street, Integer number, String city) { this.street = street; this.number = number; this.city = city; } }

Slide 16

Slide 16 text

class Address { private HashTable instance_variables; public Address(String street, Integer number, String city) { instance_variables = new HashTable(); instance_variables.put("street", street); instance_variables.put("number", number); instance_variables.put("city", city); } }

Slide 17

Slide 17 text

Hash tables everywhere!

Slide 18

Slide 18 text

Inline caching

Slide 19

Slide 19 text

p = Person.new p.name

Slide 20

Slide 20 text

Specific object layout

Slide 21

Slide 21 text

class Address attr_reader :street attr_reader :number attr_reader :city end Address.instance_variable_get("@seen_ivars") => [:@street, :@number, :@city]

Slide 22

Slide 22 text

0001: push_ivar :@number self[1] Removes hash table lookup

Slide 23

Slide 23 text

Just in time compilation

Slide 24

Slide 24 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 1 + 2 + 1 = 4 FIXNUM(4) = 0x9

Slide 25

Slide 25 text

What about you as a developer?

Slide 26

Slide 26 text

Be nice

Slide 27

Slide 27 text

Write type stable code

Slide 28

Slide 28 text

Small and simple methods

Slide 29

Slide 29 text

Benchmark!

Slide 30

Slide 30 text

Recap

Slide 31

Slide 31 text

Fast dynamic languages are harder, not impossible

Slide 32

Slide 32 text

Writing simple and well factored code is often easy to optimize for a VM

Slide 33

Slide 33 text

?