2011-01-20 4 views
0

クラス持つとき:キャッシュしますか?

class X 
    { 
    int data_; 
    void f() 
    { 
    //shall I cache var data_? by doing 
    int cached = data_ 
    //and instaed of this: 
    if (data_ >= 0 && data_ < 1000 || data_ < 0 && data_ > -1000)//first version 
     { 
     //do something 
     } 
    else 
     { 
     //do somegthing else 
     } 
    // have this: 
    if (cashed >= 0 && cashed < 1000 || cashed < 0 && cashed > -1000)//second version 
    // in my opinion this is bad code 
     { 
     //do something 
     } 
    else 
     { 
     //do somegthing else 
     } 
    } 
    }; 

をコード内のコメントを参照してください。
大学からの私の共犯者がこの種のコード(1行目)は単なる悪いコードだと言っているので、私はこの質問をしています。私は彼がゴミを話していると思うが、私はこの主題についてあなたの意見に非常に興味がある。
ありがとうございます。あなたのDATA_変数が途中で実行を変更することができない限り、

+1

私はあなたの質問のタイトルを見ました。ドナルド・クヌスの書籍の中でエラーが見つかりました:-) – MattiaG

+0

「現金」の代わりに「キャッシュ」を意味すると思いますか?そして、あなたはいくつかのインデントでポストを変更できますか?これは読みにくいです。 – Dirk

+1

@FrustratedWithPormsDesing私はキャッシュの代わりに現金を "エラー"意図的にこのタイトルをより面白くしました;) – user583216

答えて

1

*は

をキャッシュされ、これら2つのコードセグメントの間全く違いはありません。

+0

+1、最初のバージョンが悪い実用的なケースは、_dataに同時に2つのスレッドがアクセスできるマルチスレッドアプリケーションでコードを実行する場合です。 – gravitron

+3

2つのスレッドが同じオブジェクトで動作していると仮定すると、いずれのバージョンもスレッドセーフではありません。 –

1

最も遅くない場合を除いて、最適化しないでください。最も明瞭でシンプルなコードを作成し、測定し、遅すぎる場合はツールを使用して最も遅い部分を発見します(推測できません)。可能であれば、より良いアルゴリズムを使用して、&その他のマイナーな最適化をキャッシュに配置してください。いずれにしても、その部分を最適化したら、もう一度測定し、まだ遅すぎる場合は繰り返してください。

言われているように、@ Zhaisは正しいです。 2つのコードスニペットに機能的な違いはありません。

+0

測定、測定、思考、測定、変更、測定、測定、考える。 +1しても、これについて心配する必要はなく、ほとんどの場合、 'data_'が実行中に変更されなければ、全く影響はありません。だから重要なときは、それはパフォーマンスの問題ではなく、正確さの問題です。 –

1

この種の最適化を時期尚早最適化といいます。ボトルネックであることが判明するまで、最適化を行うべきではありません。

最初のケースでは、変数は実際にはthis->data_として使用されていますが、コンパイラがそれをキャッシュする可能性があるため、確信が持てません。

関連する問題