scala3 icon indicating copy to clipboard operation
scala3 copied to clipboard

Performance of compiletime tuple construction

Open Katrix opened this issue 3 years ago • 0 comments

Compiler version

3.2.0

Minimized example

Tuple construction through constValueTuple, summonAll and probably others too currently run in quadratic time at runtime, constructing all the smaller tuple sizes before getting to the desired one.

  def foo: (String, Int, Double, String, Boolean) =
    scala.compiletime.constValueTuple[("foo", 5, 3.14, "bar", false)]

Decompiled Java

   public Tuple5 foo() {
      String var2 = "foo";
      boolean var5 = true;
      double var8 = 3.14;
      String var12 = "bar";
      boolean var15 = false;
      Tuple.package.EmptyTuple Tuple_this = .MODULE$;
      Product res = (Tuple1)scala.runtime.Tuples..MODULE$.cons(BoxesRunTime.boxToBoolean(false), Tuple_this);
      Tuple1 Tuple_this = (Tuple1)res;
      Product res = (Tuple2)scala.runtime.Tuples..MODULE$.cons("bar", Tuple_this);
      Tuple2 Tuple_this = (Tuple2)res;
      Product res = (Tuple3)scala.runtime.Tuples..MODULE$.cons(BoxesRunTime.boxToDouble(3.14), Tuple_this);
      Tuple3 Tuple_this = (Tuple3)res;
      Product res = (Tuple4)scala.runtime.Tuples..MODULE$.cons(BoxesRunTime.boxToInteger(5), Tuple_this);
      Tuple4 Tuple_this = (Tuple4)res;
      Product res = (Tuple5)scala.runtime.Tuples..MODULE$.cons("foo", Tuple_this);
      return (Tuple5)res;
   }

Expectation

   public Tuple5 foo() {
      return scala.Tuple5..MODULE$.apply("foo", BoxesRunTime.boxToInteger(5), BoxesRunTime.boxToDouble(3.14), "bar", BoxesRunTime.boxToBoolean(false));
   }

Katrix avatar Sep 07 '22 12:09 Katrix