2017-12-13 5 views
0

この質問は、あなたが非常に状況的であることを好むものの大部分の問題だと思いますが、今日はかなり長い参照でgameobjectへの道を訪れました。私は一時参照がこのような状況の方が良いでしょう。いつも使用するたびにパス全体を参照するのではなく、オブジェクトへの参照を保持するために一時オブジェクトを使用するときの大まかな規則は?

コード:パスを確認するために、複数の配列インデックスで、この長さであり、それは間違いなく速くなりますが、ために余分なオブジェクトのも、同じようにそれを行うには、より高価になる場合

if (enlargeableButtons[i][j].gameObject.activeSelf && enlargeableButtons[i][j].IsHighlighted()) 
{ 
    enlargeableButtons[i][j].gameObject.SetIsHighlighted(true, HoverEffect.EnlargeImage); 
} 

これは:

GameObject temp = enlargeableButtons[i][j].gameObject; 

if (temp.activeSelf && temp.IsHighlighted()) 
{ 
    temp.SetIsHighlighted(true, HoverEffect.EnlargeImage); 
} 

しかし、それはどれくらいの価値がありますか?

+4

これは時期尚早の最適化の主要な例のようです。 – Milster

+4

これは一時オブジェクト*ではなく、一時変数*です。 C#の変数には、struct(値型)または* references *(まれにポインタ)が含まれています。単一のオブジェクトは複数の参照を持つことができ、参照自体は非常に小さくなります。 –

+0

これはコンパイル時の最適化の候補のようです。配列参照があるときにC#がこれを処理するかどうかを誰でも確認できますか? – cgTag

答えて

3

GameObject tempを宣言すると、enlargeableButtons[i][j].gameObjectへの参照が作成されます。余分なオーバーヘッドですが、それほど多くはありません。数千回以上繰り返さない限り、違いは気付かないでしょう。

個人的なルールとして、一度参照するだけであれば、変数を宣言することに気にする必要はありません。しかし、もし私がenlargeableButtons[i][j].gameObjectのようなものを何度も使う必要があれば、変数を宣言します。

+1

明確にするために私の言葉を更新しました。 –

+1

追加のローカル変数を持つコストは、フレームが設定されているときにスタックフレームが追加のワードだけインクリメントされることに過ぎません。実際には本当の懸念事項ではない、スタックオーバーフロー例外が発生しない限り、実際にはコストはまったくありません。 – Servy

4

ギザギザの配列を通過するのではなく、ダイレクトリファレンスを使用してパフォーマンスの向上が見られることは間違いありません。
このコードが非常にタイトなループで実行され、繰り返し回数が多い場合は、数ミリ秒の差が生じることがあります。

ただし、読みやすさの観点から、2番目のオプションははるかに読みやすくなっていますので、間違いなくそれに付いて行きます。

原則として - パフォーマンスのためではなく、分かりやすくするためにコードを設計する必要があります。 可能な限り明確な方法で実装しているアルゴリズムを伝えるコードを書く。 パフォーマンスの目標を設定し、コードのパフォーマンスを測定します。 あなたのコードがあなたのパフォーマンス目標を測らない場合は、ボトルネックを見つけて、それらを扱います。 コードを設計するときにナノ最適化に時間を費やしてはいけません。

と私の意味を説明するための個人的な話:
私はかつてobj.child.grandchildがたくさんあったプロジェクトを書いていました。プロジェクトを書き始めた後、私はそれが非常に多くの呼び出しであることに気付きました。クラスのプロパティを作成しました。その孫を参照していました。私のコードは突然非常に良くなりました。

関連する問題