jsoniter-scala icon indicating copy to clipboard operation
jsoniter-scala copied to clipboard

Cache results of default methods and reuse them during serialization to minimize allocations

Open plokhotnyuk opened this issue 7 years ago • 1 comments

Currently default methods are called on each encoding method call, for example:

private def e0(x: JsonCodecMakerSpec.this.Defaults, out: JsonWriter): Unit = if (x.ne(null))
   {
     out.writeObjectStart();
     {
       val v = x.s;
       if (v.!=(Defaults.`<init>$default$1`))
         {
           out.writeNonEscapedAsciiKey("s");
           out.writeVal(v)
         }
       else
         ()
     };
     {
       val v = x.i;
       if (v.!=(Defaults.`<init>$default$2`))
         {
           out.writeNonEscapedAsciiKey("i");
           out.writeVal(v)
         }
       else
         ()
     };
...

Should be:

private val dv0: String = Defaults.`<init>$default$1`
private val dv1: Int = Defaults.`<init>$default$2`
private def e0(x: JsonCodecMakerSpec.this.Defaults, out: JsonWriter): Unit = if (x.ne(null))
   {
     out.writeObjectStart();
     {
       val v = x.s;
       if (v.!=(dv0))
         {
           out.writeNonEscapedAsciiKey("s");
           out.writeVal(v)
         }
       else
         ()
     };
     {
       val v = x.i;
       if (v.!=(dv1))
         {
           out.writeNonEscapedAsciiKey("i");
           out.writeVal(v)
         }
       else
         ()
     };

plokhotnyuk avatar Jan 03 '18 09:01 plokhotnyuk

WARNING: It should be done only for immutable values

plokhotnyuk avatar Jun 24 '22 12:06 plokhotnyuk