0

私は次のようなコードを使用します:

Double getabsValue(final Object[] value){

if (value==null) return null;
if (value.lengt==0) return null;

final Double absValue=Maths.abs(value[0]);

if (absValue>0) return absValue
else return null;

しかし、私のアプリケーションでは、パフォーマンスに問題があります。どのように最適化できますか?

多分もっと良い使用?

if (absValue>0) return absValue
else return absValue<0?-absValue:null;

ありがとう

4

2 に答える 2

7

さて、あなたが今持っているコードはコンパイルさえしません -Math.abs(Object)私が知る限り呼び出しはありません。ただし、実際にそこにギプスがあると仮定するとDouble、常にボクシングをすることになります。次のように、値がすでに 0 より大きい場合はボクシングを回避し、値0の場合は呼び出しを回避できます。

static Double getAbsValue(Object[] values) {
    if (values == null || values.length == 0) {
        return null;
    }
    Double value = (Double) values[0];
    return value > 0 ? value
         : value == 0 ? null
         : -value;
}

最後のオプションにたどり着くまでに、値が負であることはすでにわかっているので、これ以上呼び出す必要はありませんabs

ここでのコンテキストが何であるかは明確ではありません。あなたはパフォーマンスの問題があると言っていますが、それは間違いなくこのコードにありますか?

編集:あなたの最新のコードが示しています:

if (absValue>0) return absValue
else return -1*absValue;

元のコードのように、配列にボックス化された 0 値が含まれている場合、null は返されません。

パフォーマンスの前に正確さに集中する必要があります。

0 の入力でコードに何をさせたいですか? 0 を返したい場合は、次を使用します。

return value >= 0 ? value : -value;

null を返したい場合は、最初に提供したコードを使用してください。

ところで、単項否定演算子を使用するだけでなく、-1 による乗算を含めるのはなぜですか? とにかく、コンパイラまたはJITのいずれかがそれを取り除くことを期待していますが、基本的に、乗算を実行したくない-否定を実行したいのです。目的を説明する方法にできるだけ近いコードを読んでください。

于 2011-10-13T06:06:14.140 に答える
3

私は次のようなコードを使用します:

Double getabsValue(final Object[] value){

なんで?

これで最初に行うことは、署名を再定義することです。

  • Object[]基本的にDouble[]、または少なくともDoubleObject[]含むである必要がある場合を指定しても意味がありません。そうしないと、ClassCastException がスローされます。
  • 最初の要素だけを使用するのに、なぜ配列を指定するのですか?
  • Doubleあなたが本当に必要としているのはなぜdoubleですか?

したがって、 type の単一の引数を取るように再定義しますdouble。これにより、配列から何かを取得するオーバーヘッドが呼び出し元に戻り、そこでそれを見ることができます。彼は配列さえ持っていない可能性があるため、このメソッドを呼び出すには配列を作成する必要があります。そして、彼はすでに Double ではなく double を持っている可能性があり、その場合も、彼またはコンパイラーはそれを Double にボックス化する必要があります。

2 番目に行うことは、この変更後に何が残っているかを確認することです。この変更により、null チェックと長さチェック、および型キャストが取り除かれるため、残るのはreturn Math.abs(d);メソッド全体が基本的に無意味であることが明らかになります。

したがって、私がそれで行う3番目のことは、それを削除することです.

于 2011-10-13T06:55:04.473 に答える