2009-08-11 11 views
3

関数から3つのオブジェクトを取得する必要があります。私の本能は、3つの参照を返す新しい型を作成することです。あるいは、同じ型のリファレンスであれば、配列を使うことができます。しかし渡しの参照が容易である:ラッパー型とパス型の比較パラメータの長いリスト


     private void Mutate_AddNode_GetGenes(ref NeuronGene newNeuronGene, ref ConnectionGene newConnectionGene1, ref ConnectionGene newConnectionGene2) 
     { 

     } 

は、これでは何の問題も当然ありませんが、私はこの方法を使用することを躊躇し、主に私が美学とpsycholgicalバイアスの理由のためだと思います。実際に、これらのアプローチの1つを他のものよりも有効にする理由はありますか?おそらく、余分なラッパーオブジェクトを作成したり、スタックにパラメータをプッシュする際のパフォーマンスの問題です。私の特別なケースでは、これはCPU集約的なコードであることに注意してください。 CPUサイクルは重要です。

C#3のアプローチのよりエレガントなC#2はありますか?

ありがとうございました。

答えて

3

ほとんどのコンピューティングの問題では、CPUの違いに気付かないでしょう。サンプルコードに "Gene"という単語が含まれているため、実際には気付くはずのまれなカテゴリに分類されます。

他のオブジェクトをラップするだけでオブジェクトを作成および破棄すると、パフォーマンスが低下します(作成してガベージコレクションを行う必要があります)。

無関係のオブジェクトをグループ化する目的だけのオブジェクトは作成しませんが、それらが論理的に一緒に属していれば、それを含むオブジェクトを定義するのはまったく問題ありません。

+2

PS - スタック上のデータを管理するのは、ヒープ内のデータを管理する場合と比べて非常に効率的です。 –

+1

@エリック、答えにそのコメントを入れないのはなぜですか? –

+0

事実の後にコメントを追加する方が速かったからですか?私がコメントを投稿するのではなく、答えを編集することを知らない理由はありますか? –

1

ラッピングタイプ(IMHOの方がきれいです)のパフォーマンスを心配している場合は、構造体を使用する必要があります。現在の.NETの32ビット実装(および64ビットの上位バージョンの4.0)は、多くの場合構造体のインライン化/最適化をサポートしているため、構造体とrefの引数の間にパフォーマンスの差はありません。

1

これらの2つのオプションの相対実行速度を心配するのは、おそらく早すぎる最適化です。最初にアルゴリズムを正しいものにし、きれいで保守可能なコードを得ることに焦点を合わせます。これが完了したら、プロファイラを実行してCPU時間の80%を占めるコードの20%を最適化することができます。このメソッドが20%に終わっても、2つの呼び出しスタイルの違いはおそらく登録するのが難しいでしょう。

パフォーマンスの問題は別として、おそらくコンテナクラスを使用しています。このメソッドは3つのパラメータしか取らず、それぞれを変更する(おそらく)ので、refパラメータの代わりに3つのメンバ変数を持つコンテナクラスのメソッドとして持つことが理にかなっているように思えます。