Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Miniboxing presentation at ScalaDays 2014

Miniboxing presentation at ScalaDays 2014

Miniboxing presentation at ScalaDays 2014: http://scaladays.org/berlin2014/index.html

The recording is available on Parleys: https://www.parleys.com/tutorial/miniboxing-specialization-diet

Project website: http://scala-miniboxing.org

Vlad Ureche

June 17, 2014
Tweet

More Decks by Vlad Ureche

Other Decks in Programming

Transcript

  1. 5 scala-miniboxing.org class C(t: Object) class C(t: Object) class C[T](t:

    T) class C[T](t: T) The process is called erasure, and it replaces type paramerers by their upper bound scalac / javac
  2. 6 scala-miniboxing.org class C(t: Object) class C(t: Object) Requires boxed

    primitive types (java.lang.Integer, ...) class C[T](t: T) class C[T](t: T) The process is called erasure, and it replaces type paramerers by their upper bound scalac / javac
  3. 7 scala-miniboxing.org class C(t: Object) class C(t: Object) Requires boxed

    primitive types (java.lang.Integer, ...) class C[T](t: T) class C[T](t: T) The process is called erasure, and it replaces type paramerers by their upper bound scalac / javac You don't see it: scala.Int can be either int or j.l.Integer. Scalac does the work for you!
  4. 8 scala-miniboxing.org class C(t: Object) class C(t: Object) Requires boxed

    primitive types (java.lang.Integer, ...) class C[T](t: T) class C[T](t: T) The process is called erasure, and it replaces type paramerers by their upper bound scalac / javac Yet boxing degrades performance - heap allocations / GC cycles ... - indirect reads, broken locality You don't see it: scala.Int can be either int or j.l.Integer. Scalac does the work for you!
  5. 16 scala-miniboxing.org @specialized @specialized @miniboxed = - the limitations -

    bytecode bloat opens the way to @miniboxed Scala collections
  6. 20 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T]
  7. 21 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4)
  8. 22 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4)
  9. 23 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4) Adapted to integers (t$mcI$sp: int)
  10. 24 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4) Adapted to integers (t$mcI$sp: int) new C(“abc”)
  11. 25 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4) Adapted to integers (t$mcI$sp: int) new C(“abc”) spec new C[String](“abc”)
  12. 26 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4) * similar transformation for methods Adapted to integers (t$mcI$sp: int) new C(“abc”) spec new C[String](“abc”)
  13. 27 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others C[T] new C[Int](4) spec new C$mcI$sp(4) * similar transformation for methods Adapted to integers (t$mcI$sp: int) new C(“abc”) spec new C[String](“abc”) Can speed up certain code patterns by up to 20x
  14. 29 scala-miniboxing.org @specialized @specialized @miniboxed = - the limitations -

    bytecode bloat • duplicate fields • broken inheriance
  15. 32 scala-miniboxing.org class C[ class C[@specialized @specialized T](t: T) T](t:

    T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others
  16. 33 scala-miniboxing.org new C(“abc”) spec new C[String](“abc”) class C[ class

    C[@specialized @specialized T](t: T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others
  17. 34 scala-miniboxing.org new C(“abc”) spec new C[String](“abc”) class C[ class

    C[@specialized @specialized T](t: T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others t: Object
  18. 35 scala-miniboxing.org new C[Int](4) spec new C$mcI$sp(4) new C(“abc”) spec

    new C[String](“abc”) class C[ class C[@specialized @specialized T](t: T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others t: Object
  19. 36 scala-miniboxing.org new C[Int](4) spec new C$mcI$sp(4) new C(“abc”) spec

    new C[String](“abc”) t$mcI$sp: int class C[ class C[@specialized @specialized T](t: T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others t: Object
  20. 37 scala-miniboxing.org t$mcI$sp: int class C[ class C[@specialized @specialized T](t:

    T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others t: Object
  21. 38 scala-miniboxing.org t$mcI$sp: int class C[ class C[@specialized @specialized T](t:

    T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others Carries two fields: • t: Object • t$mcI$sp: int t: Object
  22. 39 scala-miniboxing.org t$mcI$sp: int class C[ class C[@specialized @specialized T](t:

    T) T](t: T) C[T] C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others Carries two fields: • t: Object • t$mcI$sp: int That's bad: duplicate fields SI-3585 t: Object
  23. 42 scala-miniboxing.org class D[ class D[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] C[T] D[T]
  24. 43 scala-miniboxing.org def foo(t2: T) class D[ class D[@specialized @specialized

    T](t: T) T](t: T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] C[T] D[T]
  25. 44 scala-miniboxing.org def foo(t2: T) class D[ class D[@specialized @specialized

    T](t: T) T](t: T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] C[T] D[T] def foo$mcI$sp(t2: int)
  26. 45 scala-miniboxing.org def foo(t2: T) class D[ class D[@specialized @specialized

    T](t: T) T](t: T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] D$mcI$sp D$mcJ$sp D$mcD$sp … and 6 others C[T] D[T] def foo$mcI$sp(t2: int)
  27. 46 scala-miniboxing.org def foo(t2: T) class D[ class D[@specialized @specialized

    T](t: T) T](t: T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] D$mcI$sp D$mcJ$sp D$mcD$sp … and 6 others C[T] D[T] def foo$mcI$sp(t2: int) call foo$mcI$sp(t2: int)
  28. 47 scala-miniboxing.org class D[ class D[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] D$mcI$sp D$mcJ$sp D$mcD$sp … and 6 others C[T] D[T]
  29. 48 scala-miniboxing.org class D[ class D[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] D$mcI$sp D$mcJ$sp D$mcD$sp … and 6 others C[T] D[T] JVM: Single inheritance!
  30. 49 scala-miniboxing.org class D[ class D[@specialized @specialized T](t: T) T](t:

    T) C$mcI$sp C$mcJ$sp C$mcD$sp … and 6 others extends C[T] extends C[T] D$mcI$sp D$mcJ$sp D$mcD$sp … and 6 others C[T] D[T] JVM: Single inheritance! Specialized class inhertance doesn't work: SI-8405
  31. 54 scala-miniboxing.org C_J[T] C_L[T] C[T] class C[ class C[@miniboxed @miniboxed

    T](t: T) T](t: T) A single field t With specialized getters and setters declared in the interface
  32. 55 scala-miniboxing.org C_J[T] C_L[T] C[T] class C[ class C[@miniboxed @miniboxed

    T](t: T) T](t: T) A single field t With specialized getters and setters declared in the interface Fixed: duplicate fields SI-3585
  33. 58 scala-miniboxing.org class D[ class D[@miniboxed @miniboxed T](t: T) T](t:

    T) extends C[T] extends C[T] C_J[T] C_L[T] C[T] D_J[T] D_L[T] D[T]
  34. 59 scala-miniboxing.org class D[ class D[@miniboxed @miniboxed T](t: T) T](t:

    T) extends C[T] extends C[T] C_J[T] C_L[T] C[T] D_J[T] D_L[T] D[T] Fixed: class inhertance SI-8405
  35. 60 scala-miniboxing.org class D[ class D[@miniboxed @miniboxed T](t: T) T](t:

    T) extends C[T] extends C[T] C_J[T] C_L[T] C[T] D_J[T] D_L[T] D[T] But why so few classes? Fixed: class inhertance SI-8405
  36. 63 scala-miniboxing.org Where's the Where's the trait Function2[-T1, -T2, +R]

    bytecode bloat? bytecode bloat? Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object
  37. 64 scala-miniboxing.org Where's the Where's the trait Function2[-T1, -T2, +R]

    • fully specializing Function2 → 103 traits bytecode bloat? bytecode bloat? Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object
  38. 65 scala-miniboxing.org Where's the Where's the trait Function2[-T1, -T2, +R]

    • fully specializing Function2 → 103 traits • upfront bytecode (not on-demand) bytecode bloat? bytecode bloat? Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object
  39. 66 scala-miniboxing.org Where's the Where's the trait Function2[-T1, -T2, +R]

    • fully specializing Function2 → 103 traits • upfront bytecode (not on-demand) • too much for the Scala library bytecode bloat? bytecode bloat? Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object
  40. 67 scala-miniboxing.org Where's the Where's the trait Function2[-T1, -T2, +R]

    • fully specializing Function2 → 103 traits • upfront bytecode (not on-demand) • too much for the Scala library bytecode bloat? bytecode bloat? Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Unit, Boolean, Byte, Char, Short, Int, Long, Float, Double, Object Still want to distribute it via maven, not via torrents
  41. 69 scala-miniboxing.org But... But... we can do better we can

    do better One day in 2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!”
  42. 70 scala-miniboxing.org But... But... we can do better we can

    do better One day in 2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!” ... LONG DOUBLE INT FLOAT SHORT
  43. 71 scala-miniboxing.org But... But... we can do better we can

    do better One day in 2012 Miguel Garcia walked into my office and said: “From a low-level perspective, there are only values and pointers. Maybe you can use that!” ... LONG DOUBLE INT FLOAT SHORT a long integer
  44. 74 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE)
  45. 75 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) Stores the original type
  46. 76 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) Stores the original type Stores the encoded value (as a long integer)
  47. 77 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) BOOL 0x1 true =
  48. 78 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) BOOL 0x1 true = INT 0x2A 42 =
  49. 79 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) BOOL 0x1 true = INT 0x2A 42 = FLOAT bit representation 5.0f =
  50. 80 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) • somewhat similar to a boxed object
  51. 81 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) • somewhat similar to a boxed object • but not in the heap memory
  52. 82 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) • somewhat similar to a boxed object • but not in the heap memory • direct access to the value
  53. 83 scala-miniboxing.org And then the And then the idea was

    born idea was born it started from the tagged union TAG DATA (VALUE) • somewhat similar to a boxed object • but not in the heap memory • direct access to the value Same benefits as for unboxed values
  54. 84 scala-miniboxing.org And then the And then the idea was

    born idea was born we can reduce the number of variants C[T]
  55. 85 scala-miniboxing.org And then the And then the idea was

    born idea was born we can reduce the number of variants C_J[T] C[T]
  56. 86 scala-miniboxing.org And then the And then the idea was

    born idea was born we can reduce the number of variants C_J[T] C[T] C_L[T]
  57. 87 scala-miniboxing.org And then the And then the idea was

    born idea was born we can reduce the number of variants C_J[T] C[T] C_L[T] “From a low-level perspective, there are only values and pointers.”
  58. 88 scala-miniboxing.org And then the And then the idea was

    born idea was born we can reduce the number of variants C_J[T] C[T] C_L[T] “From a low-level perspective, there are only values and pointers.” Let's take an example
  59. 89 scala-miniboxing.org Let's take Let's take an example an example

    def choice[@miniboxed T](t1: T, t2: T): T = if (util.Random.nextBoolean()) t1 else t2
  60. 90 scala-miniboxing.org Let's take Let's take an example an example

    def choice[@miniboxed T](t1: T, t2: T): T = if (util.Random.nextBoolean()) t1 else t2
  61. 91 scala-miniboxing.org Let's take Let's take an example an example

    def choice[@miniboxed T](t1: T, t2: T): T = if (util.Random.nextBoolean()) t1 else t2 We'll have a version for primitive types
  62. 92 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: ..., t2: ...): ... = if (util.Random.nextBoolean()) t1 else t2
  63. 93 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: ..., t2: ...): ... = if (util.Random.nextBoolean()) t1 else t2 But what's the signature?
  64. 94 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: (Tag,Value), t2: (Tag,Value)):(Tag,Value)= if (util.Random.nextBoolean()) t1 else t2
  65. 95 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: (Tag,Value), t2: (Tag,Value)):(Tag,Value)= if (util.Random.nextBoolean()) t1 else t2 This is naive tagged union
  66. 96 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: (Tag,Value), t2: (Tag,Value)):(Tag,Value)= if (util.Random.nextBoolean()) t1 else t2 That's wasteful: we carry the tag for T twice This is naive tagged union
  67. 97 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: (Tag,Value), t2: (Tag,Value)):(Tag,Value)= if (util.Random.nextBoolean()) t1 else t2 That's wasteful: we carry the tag for T twice And we even return it, despite the caller having passed it This is naive tagged union
  68. 98 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](t1: (Tag,Value), t2: (Tag,Value)):(Tag,Value)= if (util.Random.nextBoolean()) t1 else t2 That's wasteful: we carry the tag for T twice And we even return it, despite the caller having passed it This is naive tagged union Insight: we're in a statically typed language, use that!
  69. 99 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](T_Tag: Tag, t1: Value, t2: Value):Value= if (util.Random.nextBoolean()) t1 else t2
  70. 100 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](T_Tag: Tag, t1: Value, t2: Value):Value= if (util.Random.nextBoolean()) t1 else t2 T_Tag corresponds to the type parameter
  71. 101 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](T_Tag: Tag, t1: Value, t2: Value):Value= if (util.Random.nextBoolean()) t1 else t2 T_Tag corresponds to the type parameter Sort of a class tag
  72. 102 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](T_Tag: Tag, t1: Value, t2: Value):Value= if (util.Random.nextBoolean()) t1 else t2 T_Tag corresponds to the type parameter Sort of a class tag Encoded as Long
  73. 103 scala-miniboxing.org Let's take Let's take an example an example

    def choice_J[T](T_Tag: Byte, t1: Long, t2: Long): Long= if (util.Random.nextBoolean()) t1 else t2
  74. 104 scala-miniboxing.org So, back to the So, back to the

    bytecode issue bytecode issue trait Function2[-T1, -T2, +R] • with specialization this produces 103 traits
  75. 105 scala-miniboxing.org So, back to the So, back to the

    bytecode issue bytecode issue trait Function2[-T1, -T2, +R] • with specialization this produces 103 traits • with miniboxing only 23 (100x less bytecode)
  76. 106 scala-miniboxing.org So, back to the So, back to the

    bytecode issue bytecode issue trait Function2[-T1, -T2, +R] • with specialization this produces 103 traits • with miniboxing only 23 (100x less bytecode) • so we expect it will be usable on the library
  77. 107 scala-miniboxing.org So, back to the So, back to the

    bytecode issue bytecode issue trait Function2[-T1, -T2, +R] • with specialization this produces 103 traits • with miniboxing only 23 (100x less bytecode) • so we expect it will be usable on the library But before we wrap this up
  78. 112 scala-miniboxing.org Let's revisit Let's revisit the example the example

    def choice[@ miniboxed T](t1: T, t2: T): T = if (nextBoolean() && t1.hashCode != 13) t1 else t2
  79. 113 scala-miniboxing.org Let's revisit Let's revisit the example the example

    def choice_J[T](T_Tag: Tag, t1: Long, t2: Long): Long = if (nextBoolean() && t1.hashCode != 13) t1 else t2
  80. 114 scala-miniboxing.org Let's revisit Let's revisit the example the example

    def choice_J[T](T_Tag: Tag, t1: Long, t2: Long): Long = if (nextBoolean() && t1.hashCode != 13) t1 else t2
  81. 117 scala-miniboxing.org Let's revisit Let's revisit the example the example

    t1.hashCode • how to translate this? • when t1 is miniboxed?
  82. 118 scala-miniboxing.org Let's revisit Let's revisit the example the example

    scala> true.hashCode res0: Int = 1231 scala> false.hashCode res1: Int = 1237
  83. 119 scala-miniboxing.org Let's revisit Let's revisit the example the example

    scala> true.hashCode res0: Int = 1231 scala> false.hashCode res1: Int = 1237 So calling hashCode on the Long won't work
  84. 121 scala-miniboxing.org Let's revisit Let's revisit the example the example

    minibox2box[T](T_Tag, t).hashCode • conversions: minibox2box, box2minibox
  85. 122 scala-miniboxing.org Let's revisit Let's revisit the example the example

    minibox2box[T](T_Tag, t).hashCode • conversions: minibox2box, box2minibox • hash code
  86. 123 scala-miniboxing.org Let's revisit Let's revisit the example the example

    minibox2box[T](T_Tag, t).hashCode • conversions: minibox2box, box2minibox • hash code – box the value back
  87. 124 scala-miniboxing.org Let's revisit Let's revisit the example the example

    minibox2box[T](T_Tag, t).hashCode • conversions: minibox2box, box2minibox • hash code – box the value back – execute the hashCode method
  88. 128 scala-miniboxing.org Performance-wise Performance-wise this is okay this is okay

    • conversions – between minboxed and unboxed integer types • free on x64
  89. 129 scala-miniboxing.org Performance-wise Performance-wise this is okay this is okay

    • conversions – between minboxed and unboxed integer types • free on x64 – between miniboxed and floating point types • low overhead (not free*) * improved translation (thanks Rex!)
  90. 130 scala-miniboxing.org Performance-wise Performance-wise this is okay this is okay

    • conversions – between minboxed and unboxed integer types • free on x64 – between miniboxed and floating point types • low overhead (not free*) – between miniboxed and boxed values • avoided by @miniboxed! * improved translation (thanks Rex!)
  91. 132 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list[@miniboxed T](t1: T, t2: T): List[T] = List[T](t1, t2)
  92. 133 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list[@miniboxed T](t1: T, t2: T): List[T] = List[T](t1, t2) List.apply[T](t1, t2)
  93. 134 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list[@miniboxed T](t1: T, t2: T): List[T] = List.apply[T](t1, t2)
  94. 135 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list[@miniboxed T](t1: T, t2: T): List[T] = List.apply[T](t1, t2) def list_J[T](T_Tag: Byte, t1: Long, t2: Long): ... = List[T].apply(t1, t2)
  95. 136 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list[@miniboxed T](t1: T, t2: T): List[T] = List.apply[T](t1, t2) def list_J[T](T_Tag: Byte, t1: Long, t2: Long): ... = List[T].apply(t1, t2) How to transform List[T]?
  96. 137 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks List[T] what is List[T] when T is miniboxed?
  97. 138 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks List[T] what is List[T] when T is miniboxed? – for specialization: [T Int] List[T] => List[Int] ←
  98. 139 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks List[T] what is List[T] when T is miniboxed? – for specialization: [T Int] List[T] => List[Int] ← – for miniboxing: still List[T]
  99. 140 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks List[T] what is List[T] when T is miniboxed? – for specialization: [T Int] List[T] => List[Int] ← – for miniboxing: still List[T] List_J[T] List_L[T] List[T]
  100. 141 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks List[T] what is List[T] when T is miniboxed? – for specialization: [T Int] List[T] => List[Int] ← – for miniboxing: still List[T] List_J[T] List_L[T] List[T] But List[T] is an interface, we can still have an adapted implementation class (List_J)
  101. 142 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](t1, t2)
  102. 143 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](t1, t2)
  103. 144 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](t1, t2) expected: T found: Long
  104. 145 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](minibox2box[T](T_Tag,t1), minibox2box[T](T_Tag,t2))
  105. 146 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](minibox2box[T](T_Tag,t1), minibox2box[T](T_Tag,t2))
  106. 147 scala-miniboxing.org The last example The last example before the

    benchmarks before the benchmarks def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply[T](minibox2box[T](T_Tag,t1), minibox2box[T](T_Tag,t2)) def list_J[T](T_Tag: Byte, t1: Long, t2: Long): List[T] = List.apply_J[T](T_Tag, t1, t2)
  107. 149 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism
  108. 150 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot
  109. 151 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot – in a week he implemented
  110. 152 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot – in a week he implemented – a value class plugin
  111. 153 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot – in a week he implemented – a value class plugin – with multi-param value classes
  112. 154 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot – in a week he implemented – a value class plugin – with multi-param value classes https://github.com/miniboxing/value-plugin
  113. 155 scala-miniboxing.org It turns out there's It turns out there's

    more here more here • essentially a very general mechanism • and Eugene (xeno-by) gave it a shot – in a week he implemented – a value class plugin – with multi-param value classes https://github.com/miniboxing/value-plugin
  114. 158 scala-miniboxing.org Benchmarks Benchmarks on the Scala library on the

    Scala library • work with Aymeric Genet (github: @MelodyLucid) • mock-up of Scala linked list – Function1 / Function2 / Tuple2 – Traversable / TraversableLike – Iterator / Iterable / IterableLike – LinearSeqOptimized – Builder / CanBuildFrom
  115. 159 scala-miniboxing.org Benchmarks Benchmarks on the Scala library on the

    Scala library • work with Aymeric Genet (github: @MelodyLucid) • mock-up of Scala linked list – Function1 / Function2 / Tuple2 – Traversable / TraversableLike – Iterator / Iterable / IterableLike – LinearSeqOptimized – Builder / CanBuildFrom
  116. 160 scala-miniboxing.org Benchmarks Benchmarks on the Scala library on the

    Scala library • benchmark: Least Squares Method
  117. 161 scala-miniboxing.org Benchmarks Benchmarks on the Scala library on the

    Scala library • benchmark: Least Squares Method
  118. 165 scala-miniboxing.org Benchmarks Benchmarks on the Scala library (bytecode) on

    the Scala library (bytecode) generic miniboxed specialized
  119. 167 scala-miniboxing.org Benchmarks Benchmarks on the Spire library (Complex) on

    the Spire library (Complex) miniboxed specialized generic
  120. 168 scala-miniboxing.org Benchmarks Benchmarks on the Spire library (RexBench) on

    the Spire library (RexBench) miniboxed specialized generic
  121. 169 scala-miniboxing.org Benchmarks Benchmarks on the Spire library (bytecode) on

    the Spire library (bytecode) generic miniboxed specialized
  122. 170 scala-miniboxing.org Benchmarks Benchmarks on the Spire library (bytecode) on

    the Spire library (bytecode) generic miniboxed specialized Spire is optimized for specialization
  123. 171 scala-miniboxing.org Credits Credits • Cristian Talau - developed the

    initial prototype, as a semester project • Eugene Burmako - the value class plugin based on the LDL transformation • Aymeric Genet - developing collection-like benchmarks for the miniboxing plugin • Martin Odersky, for his patient guidance • Iulian Dragos, for his work on specialization and many explanations • Miguel Garcia, for his original insights that spawned the miniboxing idea • Michel Schinz, for his wonderful comments and enlightening ACC course • Andrew Myers and Roland Ducournau for the discussions we had and the feedback provided • Heather Miller for the eye-opening discussions we had • Vojin Jovanovic, Sandro Stucki, Manohar Jonalagedda and the whole LAMP laboratory in EPFL for the extraordinary atmosphere • Adriaan Moors, for the miniboxing name which stuck :)) • Thierry Coppey, Vera Salvisberg and George Nithin, who patiently listened to many presentations and provided valuable feedback • Grzegorz Kossakowski, for the many brainstorming sessions on specialization • Erik Osheim, Tom Switzer and Rex Kerr for their guidance on the Scala community side • OOPSLA paper and artifact reviewers, who reshaped the paper with their feedback • Sandro, Vojin, Nada, Heather, Manohar - reviews and discussions on the LDL paper • Hubert Plociniczak for the type notation in the LDL paper • Denys Shabalin, Dmitry Petrashko for their patient reviews of the LDL paper