[mayaa-user:1013] Re: ビルド時にClassLoaderSourceDescriptor.prepareURL()の処理時間が高騰してしまいました

Susumu ISHIGAMI [E-MAIL ADDRESS DELETED]
2014年 2月 16日 (日) 01:26:42 JST


石上です。

sugaさん、ご回答ありがとうございます。

> はい、この挙動を変えたい場合は PageSourceDescriptor に該当するクラスを作成して
> org.seasar.mayaa.source.PageSourceFactory ファイルの serviceClass に指定する形での
> カスタマイズをする想定です。
>
> PageSourceDescriptor をカスタマイズされているということなので、既にその方法を
> 取られているのではないかと思いますが、そうであれば collectSourceDescriptor() を override してください。

collectSourceDescriptorをoverrideし、次のようにしてみました。

    @Override
    public boolean collectSourceDescriptor(
            SourceDescriptorObserver listener) throws Exception {
        for (Iterator it = SourceHolderFactory.iterator();
                it.hasNext();) {
            SourceHolder holder = (SourceHolder) it.next();
            if (listener.nextSourceDescriptor(
                    holder.getSourceDescriptor("")) == false) {
                return false;
            }
        }
//        ClassLoaderSourceDescriptor loader =
//            new ClassLoaderSourceDescriptor();
//        loader.setRoot(ClassLoaderSourceDescriptor.META_INF);
//        if (listener.nextSourceDescriptor(loader) == false) {
//            return false;
//        }
        return true;
    }

もし、META-INF以下のソース内にテンプレートを配置する使い方をしていなければ、
ここを外す弊害は標準のjava.lang.Throwable.htmlが読み込まれなくなるのだと思います。

自前で同ファイルをコンテキストルートに配置していれば、問題がないと思います。
return 値の部分が若干理解できていないため、これでよろしいでしょうか。

> ClassLoaderSourceDescriptor#prepareURL() を呼ぶ回数は、
> Engine 設定の checkTimestamp が false の場合であれば減らせそうです。

ClassLoaderSourceDesctriptorであれば、ファイルが更新されることはまずないと思われます。
ClassLoaderSourceDescriptorのデフォルトの挙動を、ファイルの読み込みや存在チェックは初回のみとして、
Timestampのチェックも行わないこととすれば、パフォーマンスにも寄与するのではないかと思います。
もし現状でそのような設定がなく上記認識で間違えなければ、私の方でも挑戦してみます。


2014年2月16日 0:52 suga <ko.suga @ gmail.com>:
> suga です。
>
> 2014-02-12 18:19 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
>> 見たところ、PageSourceDescriptor.collectSourceDescriptor()で
>> ClassLoaderSourceDescriptorをnewで生成してしまっていますので
>> 現状では設定により外すことはできないように思われます。
>
> はい、この挙動を変えたい場合は PageSourceDescriptor に該当するクラスを作成して
> org.seasar.mayaa.source.PageSourceFactory ファイルの serviceClass に指定する形での
> カスタマイズをする想定です。
>
> PageSourceDescriptor をカスタマイズされているということなので、既にその方法を
> 取られているのではないかと思いますが、そうであれば collectSourceDescriptor() を override してください。
>
>
>> ClassLoaderSourceDescriptor.prepareURL
>>>> IOUtil.getResource()
>> の効率化が可能でしたらご検討頂ければと思います。
>
> ClassLoaderSourceDescriptor#prepareURL() を呼ぶ回数は、
> Engine 設定の checkTimestamp が false の場合であれば減らせそうです。
>
> --
> suga ( ko.suga @ gmail.com )
>
>
> 2014-02-12 18:19 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
>> 石上です。
>>
>> いつもお世話になっております。
>>
>> VisualVMのサンプラーを使用してMayaaテンプレートビルド時の処理時間を計測をしたところ、
>> 次の箇所での処理時間の99%を占めていることがわかりました。
>> org.seasar.mayaa.impl.util.IOUtil.getResource()
>>
>> 呼び出し元は
>> org.seasar.mayaa.impl.source.ClassLoaderSourceDescriptor.prepareURL()
>> となっていて、
>>
>> この中で
>>         if (_url == null) {
>>             ClassLoader loader = Thread.currentThread().getContextClassLoader();
>>             _url = IOUtil.getResource(path, loader);
>>         }
>> と言う箇所があり、
>> IOUtil.getResource(path, loader);
>> がnullの場合、このロジックに何回も突入してしまうのではないかと思われます。
>> ここでIOUtil.getResourceがnullだった時と、まだIOUtil.getResourceを実行していない
>> nullの状態を判断できるようにすれば効率化出来るのかもしれません。
>>
>> 私のアプリケーションではPageSourceDescriptorもクラスローダーもカスタマイズしていますので、
>> 通常の使い方ではこんなにパフォーマンスのボトルネックにならないのかもしれません。
>> 私は、ClassLoader内にテンプレートやmayaaファイルを格納する使い方は
>> していませんので、
>> ClassLoaderSourceDescriptor
>> をPageSourceDescriptorから取り除かれるように設定できませんでしょうか?
>>
>> 見たところ、PageSourceDescriptor.collectSourceDescriptor()で
>> ClassLoaderSourceDescriptorをnewで生成してしまっていますので
>> 現状では設定により外すことはできないように思われます。
>>
>> ClassLoaderSourceDescriptor.prepareURL
>>>> IOUtil.getResource()
>> の効率化が可能でしたらご検討頂ければと思います。
>> _______________________________________________
>> mayaa-user mailing list
>> mayaa-user @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/mayaa-user
> _______________________________________________
> mayaa-user mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user



-- 
Susumu ISHIGAMI
susumu.ishigami @ gmail.com


mayaa-user メーリングリストの案内