2012-01-03 6 views
4

私はoptionの利点をよく理解していますが、この場合パフォーマンス上の理由からoptionを使用しないでください。 optionはクラス内の型をラップします。これはガベージコレクタのためのより多くの作業を意味するだけであり、私はそれを避けたいと考えています。F#タイプのフィールドをヌルにする

この場合、同じ状況下ではすべてSomeの複数のフィールドがありますが、タプルがクラスであり、GCに追加のストレスがかかるため、タプルに入れたくありません。だから私はにアクセスしてしまいます。これはoptionの目的を破ります。

optionの型がnullの可能性のある参照として扱われることがわかっていない最適化がない場合は、nullを使用します。私はそれをすることができる方法はありますか?

編集:私がやっていることを拡張するために、私はbounding volume hierarchyを作成しています。これは実際にはリーフノードでのみデータを持つバイナリツリーです。アイテムを不変に保つことはパフォーマンス上の理由からオプションではなく、差別化されたユニオンはmutableのメンバーを持つことはできません。ref秒 - GCの圧力に加えて、これをもう一度、差別化されたユニオンとしてではなくクラスとして実装します。

機能的な言葉で言えばばかげて、Node親タイプの継承として各ノードタイプをやり遂げることになるかもしれません。 Downcastingは正確には最速の操作ではありませんが、XNAとWP7に関する限り、GCを怒らせるよりも何かが優れています。

+1

あなたのケースでは、 – svick

+0

@svickはい、残念ながら、それはXNAゲームの衝突検出用です。つまり、最終的にWP7またはXbox 360で実行されていて、いずれも1世代のGCを搭載している可能性があります。 –

+0

"と表示され、GCにさらに負荷がかかります。 - これを測定しましたか? –

答えて

2

this MSDN documentationによれば、タイプを[<AllowNullLiteral>]属性で飾ると、Unchecked.defaultof<T>()を呼び出してnullを作成できます。

これは、F#内で欲しいことをするための唯一の方法だと思われます。そうでなければ、あなたは別の.net言語にマーシャルしてそこからヌルを得ることができます...しかし、私はあなたが望むものではないと推測しています

+0

それは、コンシューマの種類に '[]'とマークする必要があります。私の4つのフィールドのうちの3つは、現在、左、右、親のノードであるnullになります。 –

+6

実際には、私はドキュメントを誤解していると思います。あなたが所有する型に対して '[]'を使って、nullを正しい値として許可してください。 'Unchecked.defaultof ()'を使用して、あなたが所有していないF#タイプのヌル値を作成し、そうでなければヌルを適切な値として許可しないでください( 'object.ReferenceEquals(x、コンパイラのチェックを回避するために 'x = null'の代わりに' 'null ')。 –

+0

@Stephenええ、私が必要だったのは 'Unchecked.defaultof 'でした。 –

関連する問題