1

compareTo()クラスのメソッドを使用してBigDecimal、(大きな) 実数を文字列として読み取り、その型 (基本的には「大きすぎる」、double または float) に従って分類するJava アプリケーションがあります。アプリケーションは 1 秒間に非常に多くの文字列を読み取るため、パフォーマンスの最適化が不可欠です。

以下は、コードの省略された抜粋です。

static final BigDecimal MAX_LONG    = new BigDecimal(Long.MAX_VALUE);
static final BigDecimal MAX_FLOAT   = new BigDecimal(Float.MAX_VALUE);
static final BigDecimal MAX_DOUBLE  = new BigDecimal(Double.MAX_VALUE);

String value = readValue(); // Read the number as a string

BigDecimal number = new BigDecimal(value);

if (number.compareTo(MAX_DOUBLE) > 0)
{
    ...
}
else if (number.compareTo(MAX_FLOAT) > 0)
{
    ...
}
else if (number.compareTo(MAX_LONG) > 0)
{
    ...
}

では、2点質問

  1. マルチスレッド環境で、上記の比較を行っても安全ですか (静的フィールドが与えられた場合)?
  2. 上記の分類を実装するスレッドセーフで高速な方法はありますか?
4

2 に答える 2

5

BigDecimal は不変であるため、スレッドセーフでもあります。

また、可能性のあるキャッシングを利用するためBigDecimal.valueOf()に、全体ではなく使用する必要があります。new BigDecimal()

于 2012-10-29T22:56:39.260 に答える
1

比較が本当にボトルネックであるかどうかを疑問視した人々に同意します。ファイルまたはネットワークのIO時間の可能性が高くなります。

比較が本当にボトルネックであり、データについてIIDまたは同様の仮定を行う場合、各間隔に含まれる入力をカウントするヒストグラムを保持し、最も頻繁になるようにテストをその場で並べ替えると、比較の必要性が少なくなります。ケースが最初に検証されます。

たとえば、現在の比較のラダーは、より大きい数値が多数ある場合に最適ですMAX_DOUBLE。数値ごとに1つの比較のみが必要です。ただし、ほとんどの数値が、以下の場合は最悪です。その場合、数値MAX_FLOATごとに3つの比較が必要になるためです。

于 2012-10-29T23:42:41.943 に答える