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

suga [E-MAIL ADDRESS DELETED]
2014年 2月 16日 (日) 21:33:35 JST


suga です。

2014-02-16 1:26 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
> collectSourceDescriptorをoverrideし、次のようにしてみました。

良いと思います。

returnの値は使っていないので気にしなくて良いです。
(多分作っている過程の試行錯誤が残ってしまっているだけだと思うのですが)


> ClassLoaderSourceDesctriptorであれば、ファイルが更新されることはまずないと思われます。

いえ、そこは使い方次第です。
また、バグではないのでデフォルトの挙動を変えることは避けたいです。

ひとまずcheckTimestampがfalseの場合は以下の対応で何度もチェックすることは
避けられます。

https://github.com/seasarorg/mayaa/commit/4a50fef5d3f2086c8c2a37eeaca037828d851ae8
--
suga ( ko.suga @ gmail.com )


2014-02-16 1:26 GMT+09:00 Susumu ISHIGAMI <susumu.ishigami @ gmail.com>:
> 石上です。
>
> 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 mailing list
> mayaa-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/mayaa-user


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