単一の場合と三項演算子-パフォーマンス

Aug 20 2020

単一のif対三項演算子を使用する場合のパフォーマンスに関する理解が必要です。

変数を初期化するラッパーインスタンスを作成します。以下の例:

public class MyWrapperClass{
    public string sUserName;
    
    public MyWrapperClass(){
        this.sUserName = '';
    }
}

ここで、バックエンドから返された値をラッパー変数に割り当てながら、バックエンドから返された値が空白でないかどうかを確認するために単一のifを使用します。以下は私がすることです:

if(String.isNotBlank(myObj.myField__c)){
    myWrapperInstance.sUserName  = myObj.myField__c;
}

変数を空の文字列としてすでに初期化しているため、ここではelse条件はありません。したがって、フィールドに値が存在しない場合、変数は空の文字列を保持します。

ただし、以下を使用することが理にかなっているかどうかを理解する必要があります。

myWrapperInstance.sUserName = String.isNotBlank(myObj.myField__c) ? myObj.myField__c : '';

または

myWrapperInstance.sUserName = myObj.myField__c != null ? myObj.myField__c : '';

パフォーマンスの観点から、2つのうちどちらが優れているかを理解するのに助けが必要ですか?

回答

6 DavidReed Aug 20 2020 at 04:58

これらのフォーム:

myWrapperInstance.sUserName = String.isNotBlank(myObj.myField__c) ? myObj.myField__c : myObj.myField__c;

そして

myWrapperInstance.sUserName = myObj.myField__c != null ? myObj.myField__c : myObj.myField__c;

リンゴからオレンジです。String.isNotBlank()は単にをチェックするだけnullでなく、空の空白文字列もチェックしnullます。これは、をチェックするよりも計算コストが高くなります。パフォーマンスと同等ではないため、特定の要件に必要なものを使用してください。

さらに、Apexコンパイラが適度に賢い場合は、比較の結果が同じになるため、これらの両方を記述どおりに最適化する必要があります。(しかし、それはあなたの例の単なる間違いだと思います)。

三項演算子とifステートメントのどちらが速いかについては、Derek F.がコメントしたように、問題ではありません。パフォーマンスへの影響がある場合、また、Apexコンパイラが賢い場合は、まったく違いはないはずですが、アプリケーションの他のパフォーマンス特性によって完全に圧倒され、未定義/将来のSalesforceリリースで変更される可能性があります。心配しないでください。