[seasar-dev:293] Re: [S2Container] パフォーマンス劣化を引き起こす問題発見

Koichi Kobayashi koichik @ improvement.jp
2006年 3月 6日 (月) 02:00:08 JST


小林 (koicik) です.

Date:    Mon, 6 Mar 2006 01:37:53 +0900
From:    "Takanori Suzuki" <szk-micamale @ giga.ocn.ne.jp>
To:      <seasar-dev @ ml.seasar.org>
Subject: [seasar-dev:292] [S2Container] パフォーマンス劣化を引き起こす問題発見

> S2Container にパフォーマンス劣化を引き起こす箇所を発見したので、
> ひとまず報告します。

ありがとうございます.
# 実は気づいてはいて,金曜日にこもりさんとも少し話をしたところ

>  あるコンポーネントを取得しようとする際に、以下のような処理に
>  なるためです。
> 
>  ・include された dicon は線型検索で解析される。

これは例外があって,検索のキーがコンポーネント名で,
それが名前空間を使っていると名前空間にマッピングされた
コンテナが取得され,そこから名前にマッピングされた
コンポーネントが取得されます.

それでコンポーネントが見つからなかったり,キーが
クラス (型による自動バインディングの場合など) の場合は
線形の総当たりでコンテナを辿ることになりますね.

> 【問題事例】
> 
>  例えば、S2DaoMaker を利用すると、
>  1つのDAOに対して以下のような dicon 定義が出力されます。
(中略)
>  DAOが100個あるとすると、
>  alldao.dicon を include した dicon の内容を解析する際に、
>  internalGetComponentDef が300回も実行されることになります。
>   → 100(Dao) × 3(MAuthDao.dicon → dao.dicon → j2ee.dicon)

これは厳しい...

> 【修正案】
> 
>   ・名前空間毎に component の定義を Map で保持するようにする。

そうですね,子のコンテナから見つけたコンポーネントを
キャッシュするようにする必要があるかもしれません.

>   ・あるコンポーネントを取得する際に、一度検索した dicon 定義は
>    二度と検索されないようにする。

これは対応したいですね.
実は S2Axis の AxisDeployer では <meta> の付けられた
コンポーネントを検索する際に一度検索したコンテナを
二重に検索しないようになっています.
S2Container でも同じように対応したいと思います.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>koichik @ improvement.jp</e-mail>
</signature>



Seasar-dev メーリングリストの案内