2017-02-24 5 views
4

ここにシナリオがあります。ローカル変数を作成するタイミングとオブジェクトメソッドを呼び出すタイミングはいつですか?

オブジェクトAには、オブジェクトを受け取るメソッドがあります。 2つの方法があります。どちらも本質的に同じことをしています。
randomCheck1()は、毎回isValid()メソッドを呼び出します。
randomCheck2()は、毎回ローカル変数を使用して呼び出しを行います。

Class A 
{ 
    randomCheck1(myObject obj) 
    { 
     if (obj.getInfo().isValid()) 
     { 
       : 
     } 

     // Do some more work. 
     if (obj.getInfo().isValid()) 
     { 
       : 
     } 

     // Do some more work. 
     if (obj.getInfo().isValid()) 
     { 
       : 
      } 

    } 

    randomCheck2(myObject obj) 
    { 
     boolean isValidCheck = obj.getInfo().isValid(); 
     if (isValidCheck) 
     { 
       : 
     } 
     // Do some more work. 
     if (isValidCheck) 
     { 
       : 
     } 

     // Do some more work. 
     if (isValidCheck) 
     { 
       : 
     } 
    } 
} 

2つのパフォーマンスに違いはありますか?
メソッドを複数回呼び出す必要がある場合、ローカル変数を作成する必要があるというコード化の標準はありますか?

+0

関連:https://stackoverflow.com/questions/39888446/is-it-better-to-call-a-method-on-a-variable-or-chain-it-to-the-constructor –

+0

ありがとう。素晴らしいフィードバックがたくさんあります。基本的な価値が変わる可能性があるかどうかは、ここの鍵です。 –

答えて

0

あなたは基本的に2つの質問、

1)を持つ二つの間のパフォーマンスの違いはありますか?

回答あります。主にあなたのisValid()メソッドがどれほど重いかによって異なります。あなたのメソッドがオブジェクトのの有効性を確認してから結果を返すために、計算量が多いを実行している場合は、このメソッドを一度呼び出してから再利用する方がいいでしょう。

メソッドが有効性を計算して結果を返すために1msかかると仮定すると、3回の呼び出しに3msかかるでしょう。しかし、1回の呼び出しで値を再利用して2msを節約することができます。

しかし、isValid()メソッドが計算上非常に単純な場合、2つの間にパフォーマンスの違いはありません。

2)メソッドを複数回呼び出す必要がある場合は、ローカル変数を作成する必要があるというコーディング標準はありますか?

Ans - これは固くて速いルールではありませんが、メソッドを一度呼び出すと値を取得して変数に格納し、必要なときにいつでも再利用できます。

ただし、isValid()メソッドの結果が時間と共に変化する場合は、それを複数回呼び出す必要があることにご注意ください。最初に呼び出すと、それはあなたが本当のことを言いますが、1秒後に呼び出すとfalseになります。その場合、値を保存して値の変更に応じて再利用することはできません。それを複数回呼び出す必要があります。

+0

知りたいことが他にもある場合はお知らせください。この回答があなたに役立つなら、それをうまく上書きすることを検討してください。 –

0

テストする値が1つだけの場合の種類の味です。 複数の値を考慮する必要がある場合や、複数のフェーズで一貫して処理を行う必要がある場合は、ローカル変数を保持する方がよいでしょう。

jitはisValidを「インライン」にすることはできますが、これはフィールドの単純な戻りですが、これは2次的なものです。これはイベント処理専用の実行時間と比べて非常に厄介です。 反対方向では、getInfoまたはisValidに時間がかかる場合は、必要以上に呼び出すことを避ける必要があります。

0

特に、isValid()関数が各呼び出しで大量の作業を行う場合は、ランダムチェック2が最適です。

0

実際に使用するかを、また、ビジネスシナリオに依存:

  • はobj.getInfo()はisValid()またはobj.getInfo()が の実行中に変化しています。メソッドを呼び出すと、最初の方法を使用します(たとえば、isValid()を呼び出すと毎回dbから値をフェッチしていて可変です)。
  • obj.getInfoの値(場合は)はisValid()第1は可読以上であるが、両者のいずれかを使用する方法の実行中に一定です。
  • の場合はとし、の場合は、のisValid()メソッドがどれくらい時間がかかっているかによって異なります。それが非常に短い時間を取っている場合、それは何の違いもありません。
関連する問題