3

速度に関して、Java でプログラムを最適化するための一般的な方法は何ですか。私はDOMパーサーを使用してXMLファイルを解析し、特定の単語をArrayListに保存し、重複を削除してから、単語ごとにGoogle検索URLを作成してそれらの単語をスペルチェックし、htmlドキュメントを取得し、修正された単語を見つけて保存します別のArrayList。

どんな助けでも大歓迎です!ありがとう。

4

4 に答える 4

3

SAX は DOM よりも高速です。重複を探して ArrayList を調べたくない場合は、すべてを LinkedHashMap に入れます。つまり、重複がなくても、ArrayList が提供する挿入順序が得られます。

しかし、実際のボトルネックは、HTTP リクエストを Google に送信し、レスポンスを待ってから、レスポンスを解析することです。代わりに、スペルチェック ライブラリを使用してください。

編集:しかし、私の経験に基づいた推測を一粒の塩で考えてください。コード プロファイラーを使用して、プログラムの速度を実際に低下させている原因を確認します。

于 2010-11-16T22:01:32.800 に答える
3

なぜパフォーマンスを改善する必要があるのですか?あなたの説明から、ここでの大きなボトルネック (またはパフォーマンス ヒット) は、 URL にアクセスしているという事実に起因するIOになることは明らかです。

これにより、データ構造や XML フレームワークで行った小さな改善は、桁違いに小さくなります。

大きなパフォーマンスの問題には IO が関係するというのは、一般的な経験則です。面白いことに、私はまさに今、バッチ プロセスでデータベース クエリが返されるのを待っています。ほぼ1時間実行されています。とはいえ、私の XML 構文解析ライブラリーに対する改善の提案は歓迎します!

私の一般的な方法は次のとおりです。

  • あなたのプログラムは、待ち時間(IO)の観点から明らかに高価なタスクを実行していますか? これが遅延の原因であることを確認するのに十分なログがありますか (重大な場合)。

  • あなたのプログラムはロック競合を起こしやすいですか (つまり、リソースが「解放」されるのを待って、何もせずに待つことができますか?) おそらく、値を保存するための高価な計算を行っている間に全体をロックしているため、他のスレッドがマップにアクセスできなくなりますMap

  • 特性が悪い可能性のある明らかなアルゴリズム(おそらくデータマッチングまたはソート用)はありますか?

  • プロファイラー ( jvisualvmJDK 自体に同梱されているものなど) を起動し、コードのホットスポットを調べます。JVM はどこで時間を費やしていますか?

于 2010-11-16T22:01:44.740 に答える
1

一般的に、最善の方法は、ボトルネックがどこにあるかを把握して修正することです。通常、時間の 90% をコードの小さな部分に費やしており、そこに力を注ぎたいと思うでしょう。

何に時間がかかっているのかがわかったら、アルゴリズムの改善に集中してください。たとえば、最も明白なアルゴリズムを使用している場合、ArrayList からの重複の削除は O(n²) の複雑さになる可能性がありますが、正しいデータ構造を利用すれば O(n) に減らすことができます。

コードのどの部分に最も時間がかかっているかがわかって、それを修正する最善の方法がわからない場合は、質問を絞り込んで、StackOverflow に別の質問を投稿することをお勧めします。

編集

@oxbow_lakes が皮肉を込めて言ったように、すべてのパフォーマンスのボトルネックがコードの Big-O 特性にあるわけではありません。私は確かに彼らがそうだったことを暗示するつもりはありませんでした. 質問は最適化の「一般的な方法」に関するものだったので、この特定のプログラムについて話すのではなく、一般的な考え方に固執するようにしました。しかし、この特定のプログラムに私のアドバイスを適用する方法は次のとおりです。

  1. ボトルネックがどこにあるかを確認します。コードをプロファイリングするには、ハイエンドで高価なプロファイリング ソフトウェアから非常にハックなものまで、さまざまな方法があります。おそらく、これらのメソッドのいずれも、プログラムが Google からの応答を待っている時間の 99% を費やしていることを示しています。
  2. アルゴリズムに焦点を当てます。現在、アルゴリズムは(大まかに)次のとおりです。
    1. XML を解析する
    2. 単語リストを作成する
    3. 単語ごとに
      1. スペル チェックのために Google に ping を実行します。
    4. 結果を返す

ほとんどの時間は「ping Google」フェーズに費やされるため、これを修正する明白な方法は、そのステップを必要以上に実行しないようにすることです。例えば:

  1. XML を解析する
  2. 単語リストを作成する
  3. スペル サービスに単語のリストを送信します。
  4. スペル チェック サービスの結果を解析します。
  5. 結果を返す

もちろん、この場合、同じマシン上で実行されるスペル チェッカーを使用することで最大の速度向上が得られる可能性がありますが、それが常に可能であるとは限りません。たとえば、TinyMCE はブラウザー内で JavaScript プログラムとして実行され、Web ページの一部として辞書全体をダウンロードする余裕はありません。そのため、すべての単語を個別のリストにパッケージ化し、単一の AJAX 要求を実行して、辞書にない単語のリストを取得します。

于 2010-11-16T22:06:46.533 に答える
0

これらの人々はおそらく正しいですが、いくつかのランダムな一時停止により、*おそらく」が「間違いなく、ここに理由があります」に変わります.

于 2010-11-17T01:15:17.673 に答える