WebObjects 4: NSLog とレスポンス時間の遅い Windows NT アプリケーション

This article has been archived and is no longer updated by Apple.
(この情報は、こちらの記事を翻訳したものです。日本での使用環境、状況とは異なる場合があります。)

この記事は、WebObjects 4.0.1 Patch 2 および、それ以降のパッチに関する問題点を解決するための回避策について説明します。WebObjects と Enterprise Objects Framework のもっとも新しいパッチについての情報は、WebObjects の現在のパッチリスト(Article 70037: WebObjects 現在のパッチリスト(英語の情報です))を参照してください。このドキュメントは(より新しいパッチがリリースされている)今となっては時期遅れですが、まだ最新のパッチレベルにアップグレードしていないユーザに便宜を図るため、提供されるものです。

質問:Windows NT 用の WebObjects を、4.0 から 4.0.1 にアップグレードしたのですが、使用しているアプリケーションのいくつかが、4.0 上で使っていた時より処理がかなり遅くなってしまいました。この問題は、どうやって解決できるでしょうか?

回答:WebObjects 4.0.1 の NSLog には、既に確認されている問題があります。場合によっては、NSLog 命令が実行されるのに 30 秒近くもかかってしまう可能性があるのです。この問題に遭遇しているか確認するには、お使いのアプリケーションのメイン関数に、以下に挙げるコード(もしくは Java の相当するもの)を追加してみてください。

int index;
for (index=0; index<100;index++)
NSLog(@"HELLO");

この状態で、お使いのアプリケーションの実行速度が著しく遅くなった場合は、おそらくこのバグに遭遇しています。アップル社は、この問題を解決するパッチの開発に積極的に取り組んでおり、解決方法や、パッチなどの情報を Tech Info Library に掲載する予定です。パッチが準備されるまでの回避策は、手動にて NSLog() を、遅延が発生しない同等の関数に置き換えることです。たとえば、メインに以下のコードを組み込んでみてください:

extern void _NSSetLogCStringFunction(void(*)(const char *, unsigned, BOOL));

static void _GarbageFreeLogCString(const char *message, unsigned length,
BOOL withSyslogBanner) {
fprintf(stderr, "%sn", message);
}


int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int exitCode;


setbuf(stderr, NULL);
_NSSetLogCStringFunction(_GarbageFreeLogCString);
exitCode = WOApplicationMain(@"Application", argc, argv);
[pool release];
return exitCode;
}

ただし、この回避策はサポート対象ではございません。このコードはプライベート API である点に注意してください。ユーザは自分自身のリスクにおいて、上記の説明書きを使用すべきです。アップル社ではこの手続きに対して保証しておりません。また、サポートも提供いたしません。

追記:この関数はまったく Windows I/O コードを含んでおりませんので、DOS シェルから実行した場合にも、なにも出力しません。

Published Date: 2008/10/04