[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 メーリングリストの案内