-5

誰かがこのコードを最適化するのを手伝ってくれますか?

public final List<Double> Imprve() {    
List<Double> locDbValueList = new LinkedList<Double> ();
    for (int i = 0; i < 50000; ++i) {
     Calendar locMyCalendar = new GregorianCalendar ();
      locDbValueList.add(getNewDbValue(locMyCalendar.get(Calendar.YEAR), i));
}
    updateList(locDbValueList) ;    
    Integer locResult = 0 ;
    for (int i = 0; i < locDbValueList.size(); ++i) {
      final Integer locTempVal = doOperation(locDbValueList.get(i));
      if (locTempVal != null) {
        locResult += locTempVal;
      }
    }
    applyResult(locResult) ;
    return locDbValueList;
}

private Double getNewDbValue(int parYear, int parIdx) { … }
private void updateList(List<Double> valList) { … }   //Modifies value not size
private int doOperation (Double parDbRefValue) { … }
private void applyResult (int parIntValue) { … }*  

関数の適時性を向上させるために、Imprve クラスを変更したいと考えています。

4

2 に答える 2

2

私はあなたのコードのパフォーマンスをテストしていません。ただし、指定されたコードには次の問題があります。

  1. Java コーディング規約により、すべてのメソッド名は小文字で始める必要があります。したがって、メソッドの名前を に変更する必要がありImprveますimprove
  2. for ループでインスタンスを作成locMyCalendarしました。Calendarこのインスタンスからは、プロパティのみを読み取っていYearます。それは完全に不要です。この場所からこの行を削除する必要があります。putはどこかにあります。これもパフォーマンスヒットです。
  3. の null チェックlocTempValは必要ありません。doOperationメソッドが返さintれ、が値intになる可能性はほとんどありませんnull
  4. また、毎回 Integer オブジェクトを作成する必要がないため、locResult と locTempVal の型には「Integer」ではなく「int」を使用します。
于 2012-05-19T10:30:01.350 に答える
1

LinkedList の代わりに ArrayList を使用します。

経験則として、ベクター (Java の ArrayList など) コンテナーは、リンクされたリスト コンテナー (LinkedList など) よりも優れています。ベクター コンテナーは、ハウスキーピング データに対して要素ごとのオーバーヘッドを課さないため、これはメモリ サイズに関して常に当てはまります。ほとんどの場合、時間のパフォーマンスも向上します。これは、参照の局所性が向上し、メモリ サイズが小さくなるためです (したがって、コストのかかるメモリ アクセスが少なくて済みます)。リンク リスト コンテナーは、データ内の要素の追加と削除が多数ある場合にのみ、速度の点でベクター コンテナーよりも優れている場合があります。参照の局所性の改善は、コンテナがオブジェクトを格納する場合など、Java では C++ ほど顕著ではない可能性があることに注意してください。

あなたの場合、すべての決定基準は、ベクターコンテナー (ArrayList) の使用を指しています。コンテナーのサイズを事前に知っており、コンテナーの中央に要素を追加せず、Double 値を格納します。これは、コンパイラーがコンテナーに単純な double として格納する場合があります。

于 2012-05-19T10:04:44.373 に答える