$30 off During Our Annual Pro Sale. View Details »

The myth of dynamic language performance

Dirkjan Bussink
June 20, 2013
400

The myth of dynamic language performance

Talk at DevConTLV about how to make your dynamic language implementation faster. What are some basic techniques used and how do they work.

Dirkjan Bussink

June 20, 2013
Tweet

Transcript

  1. The myth of dynamic
    language performance
    DevConTLV

    View Slide

  2. Dirkjan Bussink
    @dbussink

    View Slide

  3. Rubinius
    A Ruby implementation

    View Slide

  4. View Slide

  5. “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

    View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. Static vs. Dynamic

    View Slide

  10. Weak vs. Strong

    View Slide

  11. C PHP
    Java Ruby
    Static Dynamic
    Weak
    Strong

    View Slide

  12. View Slide

  13. The lure of the hash table

    View Slide

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

    View Slide

  15. 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;
    }
    }

    View Slide

  16. 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);
    }
    }

    View Slide

  17. Hash tables everywhere!

    View Slide

  18. Inline caching

    View Slide

  19. p = Person.new
    p.name

    View Slide

  20. Specific object layout

    View Slide

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

    View Slide

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

    View Slide

  23. Just in time compilation

    View Slide

  24. 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

    View Slide

  25. What about you
    as a developer?

    View Slide

  26. Be nice

    View Slide

  27. Write type stable code

    View Slide

  28. Small and simple methods

    View Slide

  29. Benchmark!

    View Slide

  30. Recap

    View Slide

  31. Fast dynamic languages
    are harder, not impossible

    View Slide

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

    View Slide

  33. ?

    View Slide