- PR -

ファイルの中の文字列検索の速度向上

投稿者投稿内容
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2005-04-19 18:25
引用:

TomScissorsさんの書き込み (2005-04-19 18:08) より:
StringBufferに関しては、toString()で良いような気もするのですが。



うろ覚えで変なこと言ってしまったみたいで申し訳ありません……。sunのjavadocくらい読んでから書くべきでした(猛省

読むと「むしろbuffer.toString()の方が良い(=速い)」ようですね。

---

引用:

kamiさんの書き込み (2005-04-19 18:11) より:
今、コードを打ち変え終わったところです。
現在では1790行のログでも1秒弱で表示されるようになりました。



劇的に速くなりましたね。おめでとうございます。
遅かった主原因はStringの連結だった……ということのようですね。

今回はたまたま早期解決して良かったのですが、きっちりとボトルネックを洗い出してそれを地道に潰していく……等も実践出来るように頑張ってください。
とりあえず、部分部分で問題を特定→解決出来るように、意味を持った処理ブロックは随時小さく切り出すのがお勧めです。
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-19 18:47
>未記入 様

目標値は 18万件から検索する際には 3秒。
遅くとも5秒以内とあります。

検索にかかる時間を検索するにはどうしたらいいのでしょうか?
googleのように検索時間をだしたいのですが^^;
よろしければ、ご教授ください。
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2005-04-19 18:56
ファイル検索処理前後で、System.currentTimeMillis()で時間を取得して、
その差分が実行時間(若干の誤差はあります)です。

以下のような感じです。

long begin = System.currentTimeMillis();
//ファイルの検索処理開始
//ファイルの検索処理終了
long end = System.currentTimeMillis();
long diff = end - begin; //検索処理実行時間
out.println("検索処理時間:" + diff);

java.lang.SystemのAPIを参照してください。
J2SEの基本パッケージを勉強してがんばって下さい。
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2005-04-20 14:59
引用:

永井和彦さんの書き込み (2005-04-19 18:25) より:
読むと「むしろbuffer.toString()の方が良い(=速い)」ようですね。



Java 1.4 では javadoc にも以下のように書かれていて、StringBuffer#toString() で生成された String のインスタンスはバッファが共有(=コピーが起こらない)されるのですが、
引用:

実装のアドバイス: このメソッドは、文字列のコピーを格納する新しいメモリを割り当てずに、新しい String オブジェクトを生成するようにコーディングすることができます。



なぜか 1.5 ではこの記述が削除され、JDK に付いてくるソースコードも共有されないように変更されています。
なので、1.5 では new String(StringBuilder) の方が良いようです。ちなみに、こちらの方法は 1.4 でも同様で、バッファが共有されます。

それから、1.5 では StringBuilder クラスが追加され、こちらを使うことが推奨されています。(これで、C# と Java でうっかり間違えるミスも減りますね)

[ メッセージ編集済み 編集者: きよの 編集日時 2005-04-20 15:00 ]
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2005-04-20 15:17
引用:

なので、1.5 では new String(StringBuilder) の方が良いようです。ちなみに、こちらの方法は 1.4 でも同様で、バッファが共有されます。



すみません、1.5 では new String(StringBuffer) も new String(StringBuilder) もバッファがコピーされるようですが、ソースコードを見る限りでは StringBuffer#toString() の方が速いように思います。javadoc にも以下のように書かれています。

引用:

public String(StringBuilder builder)
toString メソッドを使って文字列ビルダから文字列を取得するのは、処理が高速になるので一般的に推奨されています。

スキルアップ/キャリアアップ(JOB@IT)