続・逆襲のJSONIC! ……まだまだ駄目です。

引き続き遅そうなところを調査した結果、どうもAppendableが悪さをしているような雰囲気。Appendableの各メソッドはCharSequenceになっているものの、CharSequenceは配列コピー系のメソッドがなく、JDK付属のStringBuilderのソースを読むと instanceof で分岐しまくっている。普段使うときは、Appendableではなく、StringBuilderやWriterのStringを引数に取るメソッドが使われているので、その分の速度差が発生しているらしい。

というわけで、その部分を修正した結果です。

[追記] 微妙にObject型の変換が速くなったので結果を貼り替えました。

- Jackson JSONIC 速度比
Map1000×List1000 381.1315 800.7116 1: 2.10
Map1000×List10000 3796.3256 8079.5918 1: 2.13
Map10000×List1000 3822.6797 8478.6999 1: 2.22
Map100×Object 47.9895 16.1057 1: 0.34
Map1K×Object 10.8506 13.1638 1: 1.21
Map10K×Object 30.3012 59.0540 1: 1.95
Map100K×Object 237.7610 1057.1882 1: 4.45
List100×Object 2.6117 0.7956 1: 0.30
List1K×Object 4.4467 5.3637 1: 1.21
List10K×Object 20.4574 41.2442 1: 2.02
List100K×Object 187.5207 413.8793 1: 2.21

だいたい2倍くらいの遅さに収まってきました。相変わらずオブジェクト数が増加すると速度が悪化する状況は変わらず、という感はあります。これ以上の高速化は難しそうなのだが、どうすればよいのか。

Map×Listのケースの速度差は、ほとんど文字列の変換速度の違いでMapやListの変換速度自体はほとんど変わらないと思う。でも文字列の変換もかなり最適化しているので、何が原因でこの差がでているのかは良くわからない。