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

The future of Ruby is faster

The future of Ruby is faster

Talk given at Euruko 2013

Dirkjan Bussink

June 29, 2013
Tweet

More Decks by Dirkjan Bussink

Other Decks in Technology

Transcript

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

    View Slide

  2. Dirkjan Bussink
    @dbussink
    Saturday, June 29, 13

    View Slide

  3. Rubinius
    Use Ruby
    Saturday, June 29, 13

    View Slide

  4. Saturday, June 29, 13

    View Slide

  5. Saturday, June 29, 13

    View Slide

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

    View Slide

  7. Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. Hash tables everywhere!
    Saturday, June 29, 13

    View Slide

  12. Inline caching
    Saturday, June 29, 13

    View Slide

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

    View Slide

  14. p = Person.new
    p.name

    Saturday, June 29, 13

    View Slide

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

    View Slide

  16. Global serial number
    Saturday, June 29, 13

    View Slide

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

    View Slide

  18. Per class serial number
    Saturday, June 29, 13

    View Slide

  19. Probably in 2.1
    Saturday, June 29, 13

    View Slide

  20. Instance variable packing
    Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

  23. Just in time compilation
    Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. Saturday, June 29, 13

    View Slide

  29. Creating less
    garbage
    Saturday, June 29, 13

    View Slide

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

    View Slide

  31. Saturday, June 29, 13

    View Slide

  32. 2.1
    Saturday, June 29, 13

    View Slide

  33. Auto tuning
    Saturday, June 29, 13

    View Slide

  34. Parallelism
    Saturday, June 29, 13

    View Slide

  35. Higher throughput
    Saturday, June 29, 13

    View Slide

  36. Concurrency
    Saturday, June 29, 13

    View Slide

  37. Shorter stop the world
    Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. Before
    Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. After
    Saturday, June 29, 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  54. Concurrency & parallelism
    Saturday, June 29, 13

    View Slide

  55. No GIL/GVL!
    Saturday, June 29, 13

    View Slide

  56. Future is multi-core
    Saturday, June 29, 13

    View Slide

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

    View Slide

  58. Parallel each
    Saturday, June 29, 13

    View Slide

  59. Thread safe collections
    Saturday, June 29, 13

    View Slide

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

    View Slide

  61. Be nice
    Saturday, June 29, 13

    View Slide

  62. Write type stable code
    Saturday, June 29, 13

    View Slide

  63. Small and simple methods
    Saturday, June 29, 13

    View Slide

  64. Benchmark!
    Saturday, June 29, 13

    View Slide

  65. ?
    Saturday, June 29, 13

    View Slide