6

少し読んだ後、Javaで配列をコピーする方法にいくつかの違いがあることに気づきました。私のアプリケーションでは、ノードの再帰ツリーがあり、それぞれに2Dボード配列(8x8)が含まれています。

プロファイラーのテストを通じて、私が思いついた最良の方法は、ネイティブのSystem.arraycopyを使用するjava.util.Arrays.copyOf(array)メソッドです。

それでも、私は自分の時間の80%を新しいアレイの作成に費やしています。誰かがこれをスピードアップする方法について何かアイデアがあれば、私はそれをいただければ幸いです。おそらく、8x8ではなく64アイテムの配列を使用する方が高速です。これをすぐにテストします。

4

5 に答える 5

3

配列のコピーに80%の時間を費やしているという事実は、次の2つのいずれかを意味します。

  1. 配列のコピーが遅すぎます。
  2. 配列をコピーする以外に、ほとんど何もしていません。

あなたのコピーパフォーマンスはすでに最先端かもしれません。代わりに、アプリケーションのアーキテクチャを検討し、コピーされるデータの量を減らしてみてください。

于 2012-12-16T14:15:39.457 に答える
3

コードを明確にする必要がある場合は、System.arraycopy()が最適です。

ただし、パフォーマンスが実際のボトルネックになっている場合は、次のことを確認できます。

于 2012-12-16T14:15:59.083 に答える
1

私は最近、この点について調査しました(初期化せずにプリミティブ配列を作成する方法はありますか?の自分の質問に対する私の回答を参照してください。 「WhyArray.copyOfissoslow」または「WhyJava」という名前が付けられている可能性があります。とても遅いです」)そしてOracleにRFEを送りさえしました。主なアイデアは、Javaが無駄な配列の初期化に多くの時間を費やしているということです。これは、Arrays.copyOfがどのように高速であったかについてです。

于 2012-12-16T16:04:21.817 に答える
1

アルゴリズムの改善が必要です。(最小最大チェスアルゴリズムを実行していますか?)

可能性としては、各8x8配列への参照をコピーし、各配列に「共有」フラグを追加するだけです。次に、実際にアレイを変更する場合にのみ、アレイをコピーします。すべての配列を変更しない限り、これによりコピーが大幅に削減されます。

もう1つのバリエーションは、8x8配列のよりコンパクトな表現を見つけることです(たとえば、ビットマジック)。

配列エントリには何が含まれていますか?

于 2012-12-16T16:39:01.270 に答える
0

回答ありがとうございます。8x8アレイは、基本的に9つのアレイ割り当てと1つの初期化です。8x8ではなくサイズ64の配列を使用すると、割り当ては1回だけで、初期化をスキップできます。

ただし、速度を向上させる他の方法を検討します...配列のコピーが高速であるということは、より多くのノードを作成できることを意味します:D。

みんな、ありがとう

于 2012-12-17T05:44:52.857 に答える