質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • C#

    7099questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

何度も頻繁に同じ値を代入することにデメリットはありますか?

解決済

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 860

hue

score 5

例えば下記のような「メンバに代入されたらフラグを立てておく」みたいなコードが何度も頻繁にも呼ばれる場合、

//初期値のみfalseでリセットはされない
bool Flag = false;
int m_Num;

public int Num {
    set {
        m_Num = value;
        Flag = true;
    }
}


m_Numは毎回代入するとして、フラグは一回だけ立てればよいので、

public int Num {
    set {
        m_Num = value;

        if(!Flag)
            Flag = true;
    }
}


このようにifを挟んだ方が良いのでしょうか?
また、上記ではboolにしましたが他の型の場合はどうなのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+1

結論からいうと、どっちでもいいです。

同じ値を何度代入しようが、基本的に問題はないです。
型によって問題になることがあるとすれば、パフォーマンス上の問題くらいです。

本件に限らず、一般的な指針としてですが、
パフォーマンスについては「予測するな、計測せよ」という格言があります。

実際に最小限のコードで5万回とか10万回とかfor文でループさせてみて、
処理速度に差が出るか、タスクマネージャーを開いてCPUや使用メモリに差がでるか
計測してみましょう。

たとえば10万回のループで数ミリ秒程度の差だったとしたら、
そんな差が実際のプロダクトで目に見える形で問題になることは
(よっぽどシビアなものでなければ)通常は無いはず。
そういう場合は、些細な性能よりもコードの読みやすさを優先して書くことのほうが
ずっと重要だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/25 12:48

    回答ありがとうございました。
    すっかり失念していましたが、可読性も重要ですね。

    キャンセル

checkベストアンサー

0

こんにちは。

ケースバイケースです。

Flagが単なるフィールドでしたら、一々判定するより毎回代入した方が一般に速いと思います。
Flagがfalseの場合「Flagを取り出してflaseならFlag=true;の次へジャンプ」という処理が行われます。それよりFlag=true;の方が高速に実行できる場合が多いです。

Flagがプロパティでget処理は軽くset処理が重い場合は、毎回代入するより、trueの時だけ代入するようにすることで全体として軽くなる可能性が高いと思います。
もちろん、set処理に副作用(何か他の値を変更する。例えばカウントアップする等)がある時はその副作用に応じて対処する必要があります。

bool以外の場合も基本的な考え方は同じで良いと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/25 12:36

    回答ありがとうございました。
    実際の負荷を見ながら適切な方を選択したいと思います。

    キャンセル

0

代入処理と判定処理のどちらの方が低コストなのかによります。

代入処理を削減したとしても、判定処理が必要なのでこちらの方が重いならば本末転倒です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/25 12:51

    回答ありがとうございました。
    負荷を比較して判断したいと思います。

    キャンセル

0

マルチスレッドでFlagがグローバルの場合は、if()判定は要注意ですd^^
素直に毎回代入の方がいいと思います。
[追記]
if()がなくても、スレッドセーフにはなりませんが・・・^^;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/25 12:55

    回答ありがとうございました。
    まだマルチスレッドを扱ったことはないのですが、覚えておきたいと思います。

    キャンセル

0

既に解決済みとなっていましたが、
具体的に何故早いのかが書かれていなかった為回答させていただきます。

結論からするとif比較無しの方が早いです。
何故か、についてはコンパイルされたファイルをILレベルで見て下さい。
※ILSpy, JustDecompile, DotPeek, dnSpy... などILを見る為のツールは沢山あります。

ご存知かとは思いますがC#は中間言語(IL)を出力します。
その中間言語がどれだけのステップ数があるかが基準になります。

 実例

以下のコードは以下の画像のようなILが出力されます。
圧倒的にif比較なしILの方が少ないステップ数となっています。
よって、if比較無しの方が早いとなります。

※出力されるILは最適化オプションなどによっても変化しますが、
今回の簡単なコードの場合はどの環境でも大差は無いと思われます。

static bool flag = false;

static void Function1()
{
  flag = true;
}

static void Function2()
{
  if (!flag)
  {
    flag = true;
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    7099questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。