2012-03-02 2 views
1

私は配列に値を追加したいと考えていますが、そのインデックスの現在の項目がnullの場合はどこにあっても問題ありません。このnullは、配列内の任意の場所にあります。私はちょうど私の値を どこかに入れたいです。私の配列に。私はこのようにそれを反復処理する必要があります:それはヌル点を見つける前に、それは多くの要素を反復処理する必要がありArray内の指定されていないインデックスに値を格納します。早いのは何ですか?

for (int i = 0; i < 64; i++) { 
     if (items[i] == null) { 
      items[i] = obj; 
      return; 
     } 

この方法です。別のタイプ、つまりArrayListを使用する方が速いでしょうか?

これはゲーム用ですので、パフォーマンスは非常に危機的です。これは1秒間に300回(アイテムのアクセスと削除も可能です)です。だから、ゲームでは、アイテムを格納するのに何を使うべきですか?

+0

あなたが何をやっているのかよく分かりませんが、キューやリストを試してみてください – Adrian

+1

どのようにアイテムを取得していますか?あなたはそれらにランダムにアクセスする必要がありますか(それのように聞こえますか)、あるいはそれらを反復するだけですか?また、アイテムへのアクセス方法に応じて、マップまたはセットを検討することもできます。あなたは実際にいくつかの標準Java Collectionsのパフォーマンスをテストしましたか?あなたがそれを測定するまで、パフォーマンスに影響を及ぼすものに苦しんでいる点はありません... – DNA

+0

私はそれを反復して使用します。 – user717572

答えて

1

私が過去に使用した方法の1つは、配列とキューを使用することです。配列にオブジェクトを追加するときは、まずキューをチェックして空のスロットがあるかどうかを確認します。オブジェクトを破棄するときはいつでも配列スロットをnullに設定し、そのインデックスをキューに追加して、すぐに後で取り出すことができます。私のテストでは、配列を大きめにすると配列のサイズを変更するだけなので、これはリストより高速でした。

コード賢明

Queue<int> emptySlots; 
Object[] arrayOfStuff; 

public void AddStuff(object stuffToAdd) 
{ 
    if (this.emptySlots.Count > 0) 
    { 
     int index = this.emptySlots.Dequeue(); 
     //make sure your objects know their position in the array 
     stuffToAdd.ID = index; 
     this.arrayOfStuff[index] = stuffToAdd;    
    } 
    else 
    { 
     //resize array and add new object to end rememebering to fetch its id 
    } 
} 

public void RemoveStuff(object stuffToRemove) 
{ 
    this.emptySlots.Enqueue(stuffToRemove.ID); 
    this.arrayOfStuff[stuffToRemove.ID] = null; 
} 
+0

それは良い考えです!私はそれがどうなるか見てみましょう。 – user717572

+0

コードを少し修正する必要があるかもしれませんが、これはC#の質問だと思っていましたが、キューはJavaのインターフェースですが、非常に似たようなものにする必要があります – gSamp

+0

LinkedListは私が考えたものです。パフォーマンス? – user717572

0

あなたは、多くのCollectionの実装を使用してさまざまな方法で仕事のその部分をリファクタリングすることができますが、あなたはそれが必要なのでしょうか?それは必要ですか?それはあなたのパフォーマンスを向上させるでしょうか?リアルタイムの制約がありますか?これらのコード行はボトルネックですか?あなたの配列には64個のボックスがあります。サイズを変更できますか?最初の配列の最後に項目がほとんどnullですか?あなたはスレッドセーフである必要がありますか?ストレス/負荷テストを実行し、これらの行に費やす時間(平均、最低、最高)を測定しましたか?

実行できる最適化は数多くありますが、アプリケーションの動作によって異なります。

あなたのプログラムを若干再考して、パフォーマンスを向上させることができます。 IMOそれは通常、最も効率的です。配列を何か別のものに置き換えることを考えましたか?関連する(nullではない)項目を管理するために、Queueインターフェースの独自の実装(軽量の実装)を行うことができます。配列内の位置に頼っていたら、その情報をアイテムに追加することができます(これはオブジェクトだと思います)。

関連する問題