Sunday, July 7, 2013

mixer2-1.2.6でhtmlタグのオブジェクトのディープコピーの性能が向上しました

追記
1.2.6がバグってました。すいません。1.2.6のcopy()やclone()メソッドは、html5タグのdate-*属性やaria-*属性をうまくコピーできません。 他の一般属性は大丈夫です。直し方のアイデアはあるのですが、ちょっと時間が取れません。7月中にはなんとかしますので、 それまでは1.2.5以前をご利用ください。はー、テストが甘かった。反省します。

mixer2-1.2.6をリリースしました。数時間後にmavenセントラルリポジトリから使用可能になります。 maven使わない派の方のためにjarのセットがこちらにあります

リリース頻度が早すぎるので少し落ち着かせる、と宣言してから1か月ちょいしかたっていませんが、 気になっていた部分の改善ができてしまったので、そこは、まあ。(^^;

気になっていたのはcopy()メソッドの性能です。これまではよく見かけるserialize/deserializeを駆使した手法を使っていたので、どうしてもディープコピー処理に時間がかかっていました。 1.2.6では、各htmlタグにマッピングされる全てのクラスにclone()、hashcode()、equals()メソッドが追加されています。 従来のcopy()メソッドは内部ではclone()を呼び出しているだけになっています。もちろん正確にディープコピーします。

これにより、htmlテンプレートをloadHtmlTemplate()した結果のHtmlオブジェクトをキャッシュしておき、二回目以降はキャッシュのディープコピーで済ませることで、アプリケーションの性能を高めやすくなります。従来はcopy()メソッドが重かったため、どんなキャッシュ機構を作っても大した効果は得られませんでした。

ごく簡単なキャッシュ機構を作って試したところ、いちいちloadHtmlTemplate()するよりも30%前後は性能がよくなりそうです。もちろんhtmlテンプレートの内容によって数値は異なるでしょう。また、htmlテンプレート全体ではなく、その一部のタグをcopyしながら使いまわすような処理を書く場合でも、この性能向上の恩恵は受けられます。

それから、キャッシュキャッシュ言ってますが、逆に、1.2.5まではあった、javax.cacheインターフェースを使ったキャッシュ機構を、1.2.6では完全に廃止しました。@depricatedだったメソッドも完全に削除されています。これはキャッシュ機構はmixer2本体に持たせるよりも、使う側で独自に作ってもらうほうがよいと判断したためです。mixer2が依存するjarは本当に必要最低限にしておくほうがライブラリとして使いやすいはずです。 もしやるとしても、たとえばmixer2-cachewrapperみたいな別プロジェクト/ライブラリとしてキャッシュ機構を付加したラッパーライブラリを提供する形になるでしょう。(誰か作ってください^^;)

さて、さすがにもう眠いんで寝ます。

No comments:

Post a Comment