2012-02-17 10 views
10

C#では、値渡しではなく、関数としてDateTime参照をパラメータとして渡すときに、メモリ割り当ての大幅な削減はありますか?C#でDateTimeパラメータを参照渡しでメモリ割り当てを減らすことはできますか?

int GetDayNumber(ref DateTime date) 

int GetDayNumber(DateTime date) 

対関数内のコードは、いずれの場合に日付を変更されません。

+1

「date.Day」を使用しない理由は何ですか? –

+0

重要性はどれくらい重要ですか? DateTimeオブジェクトはまったくメモリホッガーではありません。とにかくスタックやレジスタに入れられる可能性が最も高く、参照を渡しても、同じサイズ(それはDateTimeが非常に小さいのでそれほど小さくすることはできません)のデータ(つまり参照)を渡しています。 –

+0

この関数はdateとは異なる何かを行います。 この関数は何百万回も呼び出されています。私は、スタック内のメモリ割り当ての違いは、 "DateTimeのサイズ" - "参照サイズ" – jeroko

答えて

12

DateTimeは8バイトの構造体です。 refには、ターゲットアーキテクチャに応じて4または8バイトがあります。だから最高でスタックメモリの4バイトを節約することができますが、これは完全に無関係です。

refは、DateTimeをレジスタに配置するなど、いくつかの最適化を防ぎ、実際にメモリ使用量を増加させる可能性があります。

これは早すぎる最適化の明確なケースです。これをしないでください。

+0

メソッドが何百万回も連続して呼び出されるとどうなりますか?これは、参照がGC用に解放される時期によって異なります。もしそれが短命であれば、それは無視できないほどの時間の間保持されているとすれば、参考文献が肯定的な影響を与えないだろうか? –

+1

1)100万回連続しても何の効果もありません。あなたは百万回同じ8バイトを得るでしょう。何百万回も再帰的に問題になるでしょうが、C#で深く再帰的な関数を持つことはめったにありません。 2)GCはこれには入っていない。スタックに割り当てられたローカルの 'DateTime'は、GCを解放する必要はありません。関数が終了すると、スタックポインタが調整され、すべての真のローカル変数はなくなります。これは事実上無料です。 |ローカル変数が本当にローカルではない場合(ラムダキャプチャ、非同期待機、反復子...など)は複雑になりますが、ここではそうではありません。 – CodesInChaos

1

メモリ使用量が大幅に削減されたとは思いませんが、いくつかあると思います。 REFと日時を渡すときは、REFキーワード内部

-2

を使用しない場合は、DateTimeの値が長くなる、チック数として表現されているように、新しいDateTimeオブジェクトが作成されません

64ビットの。

64ビットプロセッサでは、変数のアドレスを送信するために同じ量のビットが必要です。

32ビットプロセッサで作業している場合、アドレス範囲はdatetimeのサイズよりも小さくなります。したがって、パフォーマンスを向上させることができます。

しかし、実際には、その違いはほとんど気付かれません。

+0

これは値**によって**渡される間違いです。参照型であっても、それは値で渡されます。 – oleksii

+1

DateTimeは構造体なので、参照によって渡されません - 誰かが私に言わずにC#を変更しない限り? –

+2

あなたは間違っています、DateTimeは構造体なので値渡しされます。 –

2

他の類似の質問と同じように、自分で時間を計る必要があります。いくつかのプロセッサティックが重要な役割を果たすでしょうか?あなたのアプリケーションでメモリ消費量に多少の余分なバイトがかかるでしょうか?

マイクロ最適化をそのままにして、実際の問題解決に集中してください。

0

DateTimeは構造体であり、スタックにのみ割り当てられるので、クラスのようにヒープ割り当てがないため、オーバーヘッドはほとんどありません。また、値が新しいインスタンスとして渡されるため、メソッドを終了するとすぐにスタック上の領域が解放されます。

var date = DateTime.Today; // One date time object is allocated and assigned to the stack. 
DoSomething(date); // this will result in a second date time object being allocated and assigned to the stack. 

private void DoSomething(DateTime date) 
{ 
    // do something with the date time object. 
} // As soon as we leave this method, the date time object is removed from the stack as it is now out of scope. 
+2

スタック上の構造体を解放するのはGCではありません。それらは関数の終わりにスタックポインタを調整することで単純に "解放"され、スタックの未使用部分にあります。 – CodesInChaos

+0

良い点、反映するために私の答えを更新します。 –

関連する問題