2011-07-27 13 views
2

私は繰り返し、次の計算に必要なコードの部分を持っている...パフォーマンス(ダブルD)

 double consumption = minConsumption + (Math.random() * ((maxConsumption - minConsumption) + 1)); 
     currentReading = currentReading.add(BigDecimal.valueOf(consumption)).setScale(2, RoundingMode.HALF_EVEN).stripTrailingZeros(); 

これはテスト用にランダムっぽい情報を生成するために使用されています。それは私が予想していたよりも遅く実行されているようだと私は遅い部分がBigDecimal.valueOf(consumption)であったことがわかりました、そして、内部で起こっているDouble.toString()コールのために遅いです。

全体的な必要条件は、最小値と最大値の間で無作為に消費値を生成することです。それを新しい読み込みを得るためにcurrentReadingに追加してください。

これのパフォーマンスを向上させる方法はありますか?おそらくダブル→BigDecimal変換を避けることによって。私は結果をBigDecimalにする必要がありますが、その前にランダム計算がどのように行われているか気にしません。

+0

ことによってそれを割るあなたがBigDecimal.valueOf(double)を意味するのですか? –

+1

これはパフォーマンス上の問題だと思いますか?データはありますか?そうでない場合は、あなたが早すぎる最適化をしていると思われます。 – duffymo

+0

私はそれを実行し、多くの一時停止をヒットしました。デバッガがその呼び出しでDouble.toString()コード内で停止する時間の90%。 –

答えて

7

倍を計算する代わりに、小数点以下2桁まで四捨五入したい場合は、1234が12.34を表す2つの場所でシフトされたint値を作成し、BigDecimalを作成するときに位取りを設定します。すなわち、100枚の

double min = 100; 
double max = 10000000; 
{ 
    long start = 0; 
    int runs = 1000000; 
    for (int i = -10000; i < runs; i++) { 
     if (i == 0) 
      start = System.nanoTime(); 
     double consumption = min + (Math.random() * ((max - min) + 1)); 

     BigDecimal.valueOf(consumption).setScale(2, BigDecimal.ROUND_HALF_UP); 
    } 
    long time = System.nanoTime() - start; 
    System.out.printf("The average time with BigDecimal.valueOf(double) was %,d%n", time/runs); 
} 
{ 
    long start = 0; 
    int runs = 1000000; 
    int min2 = (int) (min * 100); 
    int range = (int) ((max - min) * 100); 
    Random rand = new Random(); 
    for (int i = -10000; i < runs; i++) { 
     if (i == 0) 
      start = System.nanoTime(); 
     int rand100 = rand.nextInt(range) + min2; 
     BigDecimal bd = BigDecimal.valueOf(rand100, 2); 
    } 
    long time = System.nanoTime() - start; 
    System.out.printf("The average time with BigDecimal.valueOf(long, int) was %,d%n", time/runs); 

} 

プリント

The average time with BigDecimal.valueOf(double) was 557 
The average time with BigDecimal.valueOf(long, int) was 18 
+0

ありがとう、トリックでした。今はるかに速く、明白なボトルネックもありません。 –

+0

優れた知識+1 – mKorbel