Skip to content

Commit d4e8ebe

Browse files
author
Antoine Brunner
committed
Try to improve the performance in edge cases (n = 22 or n = 23)
1 parent 78a3211 commit d4e8ebe

File tree

1 file changed

+43
-15
lines changed

1 file changed

+43
-15
lines changed

library/src/scala/runtime/DynamicTuple.scala

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -235,14 +235,24 @@ object DynamicTuple {
235235
Tuple22(x, self._1, self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21)
236236
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
237237
val arr = new Array[Object](23)
238-
itToArray(self.asInstanceOf[Product].productIterator, 22, arr, 1)
239-
arr(0) = x.asInstanceOf[Object]
240-
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
238+
arr(0) = x.asInstanceOf[Object];
239+
arr(1) = self._1.asInstanceOf[Object]; arr(2) = self._2.asInstanceOf[Object];
240+
arr(3) = self._3.asInstanceOf[Object]; arr(4) = self._4.asInstanceOf[Object];
241+
arr(5) = self._5.asInstanceOf[Object]; arr(6) = self._6.asInstanceOf[Object];
242+
arr(7) = self._7.asInstanceOf[Object]; arr(8) = self._8.asInstanceOf[Object];
243+
arr(9) = self._9.asInstanceOf[Object]; arr(10) = self._10.asInstanceOf[Object];
244+
arr(11) = self._11.asInstanceOf[Object]; arr(12) = self._12.asInstanceOf[Object];
245+
arr(13) = self._13.asInstanceOf[Object]; arr(14) = self._14.asInstanceOf[Object];
246+
arr(15) = self._15.asInstanceOf[Object]; arr(16) = self._16.asInstanceOf[Object];
247+
arr(17) = self._17.asInstanceOf[Object]; arr(18) = self._18.asInstanceOf[Object];
248+
arr(19) = self._19.asInstanceOf[Object]; arr(20) = self._20.asInstanceOf[Object];
249+
arr(21) = self._21.asInstanceOf[Object]; arr(22) = self._22.asInstanceOf[Object];
250+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]]).asInstanceOf[Result]
241251
case xxl: TupleXXL =>
242-
val arr = new Array[Object](self.size + 1)
243-
System.arraycopy(xxl.elems, 0, arr, 1, self.size)
252+
val arr = new Array[Object](xxl.productArity + 1)
253+
System.arraycopy(xxl.elems, 0, arr, 1, xxl.productArity)
244254
arr(0) = x.asInstanceOf[Object]
245-
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
255+
TupleXXL.fromIArray(arr.asInstanceOf[IArray[Object]]).asInstanceOf[Result]
246256
}
247257
res.asInstanceOf[Result]
248258
}
@@ -253,23 +263,26 @@ object DynamicTuple {
253263
case self: Unit => return that.asInstanceOf[Result]
254264
case _ =>
255265
}
266+
256267
(that: Any) match {
257268
case that: Unit => return self.asInstanceOf[Result]
258269
case _ =>
259270
}
260271

261272
val arr = new Array[Object](self.size + that.size)
262273

263-
if (self.size <= 22) {
264-
itToArray(self.asInstanceOf[Product].productIterator, self.size, arr, 0)
265-
} else {
266-
System.arraycopy(self.asInstanceOf[TupleXXL].elems, 0, arr, 0, self.size)
274+
(self: Any) match {
275+
case xxl: TupleXXL =>
276+
System.arraycopy(xxl.elems, 0, arr, 0, self.size)
277+
case _ =>
278+
itToArray(self.asInstanceOf[Product].productIterator, self.size, arr, 0)
267279
}
268280

269-
if (that.size <= 22) {
270-
itToArray(that.asInstanceOf[Product].productIterator, that.size, arr, 0)
271-
} else {
272-
System.arraycopy(that.asInstanceOf[TupleXXL].elems, 0, arr, self.size, that.size)
281+
(that: Any) match {
282+
case xxl: TupleXXL =>
283+
System.arraycopy(xxl.elems, 0, arr, self.size, that.size)
284+
case _ =>
285+
itToArray(that.asInstanceOf[Product].productIterator, that.size, arr, 0)
273286
}
274287

275288
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]]).asInstanceOf[Result]
@@ -328,8 +341,23 @@ object DynamicTuple {
328341
case self: Tuple22[_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _] =>
329342
Tuple21(self._2, self._3, self._4, self._5, self._6, self._7, self._8, self._9, self._10, self._11, self._12, self._13, self._14, self._15, self._16, self._17, self._18, self._19, self._20, self._21, self._22)
330343
case xxl: TupleXXL =>
344+
if (xxl.productArity == 23) {
345+
val elems = xxl.elems
346+
Tuple22(
347+
xxl.elems(1), xxl.elems(2), xxl.elems(3), xxl.elems(4), xxl.elems(5), xxl.elems(6), xxl.elems(7),
348+
xxl.elems(8), xxl.elems(9), xxl.elems(10), xxl.elems(11), xxl.elems(12), xxl.elems(13), xxl.elems(14),
349+
xxl.elems(15), xxl.elems(16), xxl.elems(17), xxl.elems(18), xxl.elems(19), xxl.elems(20),
350+
xxl.elems(21), xxl.elems(22)
351+
).asInstanceOf[Result]
352+
} else {
353+
val arr = new Array[Object](self.size - 1)
354+
System.arraycopy(xxl.elems, 1, arr, 0, self.size - 1)
355+
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
356+
}
357+
case _ =>
331358
val arr = new Array[Object](self.size - 1)
332-
System.arraycopy(xxl.elems, 1, arr, 0, self.size - 1)
359+
val it = self.asInstanceOf[Product].productIterator.asInstanceOf[Iterator[Object]]
360+
itToArray(it, self.size - 1, arr, 0)
333361
dynamicFromIArray[Result](arr.asInstanceOf[IArray[Object]])
334362
}
335363
res.asInstanceOf[Result]

0 commit comments

Comments
 (0)