- - PR -
printlnについて
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-09-04 20:18
Javaは初心者なので、質問がうまくできないかもしれませんが、
よろしくお願い致します。 Servletの中で作成したResponseデータを 一回のout.printlnで出力した時、 すごく時間がかかっています。 35445バイトを出力するだけで4秒かかり、CPU使用率 まで50%に上がってしまいます。 (最近買ったサーバーで、2CPUです。遅いはずはありません。) この時間はout.printlnの前後の時間を計りました。 何が原因なのか見当が付きません。 out.printlnを50バイトずつにしても変わりませんでした。 out.printlnは何をしているのでしょうか? ファイルを作成している?回線に流している? 何か対策方法がありましたら、ご教授願います。 | ||||
|
投稿日時: 2002-09-05 00:47
> Servletの中で作成したResponseデータを
> 一回のout.printlnで出力した時、 > すごく時間がかかっています。 何かオブジェクトに文字列を生成するための情報とか入れて そこから文字列を取り出しながら出力してるんですよね? printlnに時間がかかっているのではなく、printlnに渡している 引数の生成に時間がかかっているのでは? > out.printlnは何をしているのでしょうか? 引数に与えられた文字列(またはObjectや、プリミティブ型、char[]型)を ブラウザ側に送信する処理をします。 実際には送信するのではなく、バッファリングしているので、このメソッド が遅いと言うことは考えにくいのですが。 | ||||
|
投稿日時: 2002-09-05 10:49
ご回答ありがとうございます。
XMLの文字列を一つのStringに入れて out.println(strXML)とやっています。 out.printlnの前後で時間を計ってみました。 そうしたら時間がかかり、CPU使用率も一気に上がります。 | ||||
|
投稿日時: 2002-09-05 11:01
ごめんなさい。
原因は違う所にありました。 生成したXMLの余計な改行やスペースを取るクラスが 重かったようです。 文字列バイト分回している為、長くなればなるほど時間が掛かって いるようです。 軽いReplace関数ってどの様に作ったらいいでしょうか? ご迷惑をお掛けしました。 | ||||
|
投稿日時: 2002-09-05 11:26
ちょっと実験。
50KB分の文字列をoutに出力したところ、 日本語だと 平均2.5ミリ秒 英語だと 平均0.8ミリ秒 という結果がでました。APIにも書かれているように、おそらくエンコーディングの処理をするために、多少の時間がかかってしまうのではないでしょうか。SJISしか試していないので、EUCなどのほかのエンコーディングだとまた違うかもしれません。 ただ、私のマシンはそこまで高性能ではないので、4秒というのはかかりすぎなのかもしれません。CPU時間がはねあがるのは普通です。OSがCPUを効率よく使おうとするためです。 ところで使っている環境はなんでしょうか? #あぁ、ほかのレポートがあるのにこんなことやってていいのだろうか・・・ テスト環境 Intel PentiumIII 500MHz × 1 : RAM 384MB WinXP Professional (英語) Tomcat 4.0.4 (スタンドアローン) Java SDK + JRE 1.4.0_01 ローカルホスト上でのテスト テストコード
| ||||
|
投稿日時: 2002-09-05 11:28
が〜ん。解決してたんですね・・・
| ||||
|
投稿日時: 2002-09-05 13:27
H2さん、ありがとうございます。
解決してしまいました。 しかし、XMLの余計な改行コード、スペースを取るのに 処理効率が良い方法があればいいのですが、 何かありませんか? | ||||
|
投稿日時: 2002-09-05 16:20
通常、XMLでは余計な改行コードやスペースは存在しないはずです。 もし"余計"だと感じる値があるのならそれはXMLの書き方が悪いのでしょう。 <tag> 値 </tag> のような書き方をしていませんか? <tag>値</tag> のようにしないと改行コードも値として扱われますよ。 | ||||
