18

次の 3 つの機能のうち、より効率的なのはどれか。

  public String getmConnectedDeviceName1() {
        if(null != mServerDevice) {
            return mServerDevice.getName();
        }
        else {
            return null;
        }
    }

  public String getmConnectedDeviceName2() {
        return mServerDevice == null ? null : mServerDevice.getName();
    }


  public String getmConnectedDeviceName3() {
        try{
            return mServerDevice.getName();
        }
        catch(NullPointerException e) {
            return null;
        }
    }

具体的に納得できる論理で回答してください。

4

6 に答える 6

29

が の場合、前者の方がはるかに効率的mServerDeviceですnull。両方がほぼ同じmServerDeviceでない場合。nullとの比較nullは、非常に高速な操作である 2 つの 32 ビット整数の比較です。新しいオブジェクトを作成し、スタック トレースを埋める必要があるため、例外のスローはコストがかかります。

両方とも同じバイトコードに変換されるため、Trenary 演算子... ? ... : ...はステートメントとまったく同じくらい効率的です。if (...) ... else ...

于 2013-03-02T08:23:11.683 に答える
19

まあ、「後方」比較の必要はありません (ほとんどの場合、貧弱なコンパイラを使用していたり​​、警告を無視したりした場合にタイプミスが検出されない可能性がある C からの持ち越しです) - そして、条件演算子は物事をより単純にします:

return mServerDevice != null ? mServerDevice.getName() : null;

または:

    return mServerDevice == null ? null : mServerDevice.getName();

これは、キャッチするよりも読みやすく効率的ですNullPointerException

より複雑なシナリオでは、単にifバージョンを使用してください。回避できない方法でそれをスローするバグのあるライブラリを呼び出していない限り、決してキャッチするべきではありません。NullPointerException例外は、この種の方法で使用するためのものではありません。これらは、プログラミング エラーや例外的な外部条件 (IO エラーなど) を検出するために使用されます。

例外は、他の制御フロー構造に比べて比較的コストがかかります。ただし、これを逆に考えすぎないでください。コストを回避したいという誤った欲求のために、例外を使用する必要がある場合でも、例外を回避する人がいます。適切に使用する場合、例外はパフォーマンス プロファイルの重要な部分ではありません。例外に多くの時間がかかっている場合は、環境に何か問題があるかのどちらかです (例: 永続的に接続しようとしているなど)。アクセスできないデータベース) または例外を悪用しています。

于 2013-03-02T08:21:32.537 に答える
2

私は間違いなく残りの答えに同意します。まったく同じことを言うわけではありませんが、私は今、約3年間書かれた非常に大きな商用ソースコードを紹介していて、try-catchあなたが言及したアプローチを使用したステートメントを見たことがありません. 確認することがたくさんありましたがnull;)

于 2013-03-02T08:47:51.123 に答える
1

try-catch 句を使用することは、間違いなく良い方法ではありません。

また、try-catch により、新しいオブジェクトがインスタンス化されます (例外)。また、それ以外の場合は読みやすさが向上します。したがって、n == null の場合が多い場合は (n!=null) の方が高速であると言えます。また、n!=null は超高速構造です。

于 2013-03-02T08:24:28.070 に答える
0

if-elseできる場面でご利用ください。例外のスローとキャッチはコストがかかる可能性があるため、エラー ケースを処理するために使用する必要があります (論理分岐ではありません)。

于 2013-03-02T08:24:00.807 に答える
0

パフォーマンスに関係なく、私は if-else 形式を好みます。mServerDevice が null ではないが、getName() の呼び出し中に何かがうまくいかず、NullPointerException がスローされたとします。例外ベースのバージョンは、エラーをログに記録せずに、暗黙のうちに null を返します。

于 2013-03-02T08:26:27.550 に答える