我可以通过在c#中通过引用传递DateTime参数来减少内存分配吗?

我可以通过在c#中通过引用传递DateTime参数来减少内存分配吗?,c#,performance,datetime,memory-management,pass-by-reference,C#,Performance,Datetime,Memory Management,Pass By Reference,在C#中,当将DateTime引用作为参数传递给函数而不是按值传递时,内存分配是否有显著减少 int GetDayNumber(ref DateTime date) vs 函数中的代码在任何情况下都不会修改日期。我认为内存使用没有明显减少,但我相信会有一些 使用ref传递datetime时,不会创建新的datetime对象,因为在内部不使用ref关键字时,datetime值表示为刻度数,长度为64位 64位处理器将需要相同数量的位来发送变量的地址 但如果在32位处理器中工作,则地址范围小于日期

在C#中,当将DateTime引用作为参数传递给函数而不是按值传递时,内存分配是否有显著减少

int GetDayNumber(ref DateTime date)
vs


函数中的代码在任何情况下都不会修改日期。

我认为内存使用没有明显减少,但我相信会有一些


使用ref传递datetime时,不会创建新的datetime对象,因为在内部不使用ref关键字时,datetime值表示为刻度数,长度为64位

64位处理器将需要相同数量的位来发送变量的地址

但如果在32位处理器中工作,则地址范围小于日期时间的大小。因此,可以提高性能


然而,在实践中,这种差异几乎永远不会被注意到。

与任何其他类似问题一样,你需要自己计时。几个处理器滴答声会起到重要作用吗?几个额外的字节是否会在应用程序的内存消耗中起主要作用


离开微观优化,首先集中精力解决实际问题。

A
DateTime
是一个8字节的结构。
ref
有4或8个字节,具体取决于您的目标体系结构。因此,您最多可以节省4字节的堆栈内存,这是完全不相关的

甚至有可能
ref
会阻止某些优化,例如将
DateTime
放在寄存器中,从而实际增加内存使用


这是一个明显的过早优化的例子。不要这样做

但是,由于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.

你有没有理由不直接使用
date.Day
?有多重要?DateTime对象并不完全占用内存。它很可能在堆栈上或寄存器中,甚至当你传递引用时,你仍在传递可能大小相同的数据(即引用)(因为DateTime很小,所以不能小很多)。此函数与date不同。有一天,此函数被调用数百万次,因此,它的任何改进,那太好了。我猜,堆栈中内存分配的差异是“DateTime大小”-“引用大小”,如果函数中的代码没有修改日期,那么通过引用传递的整个点就是deciduous@jeroko如果它经常被调用,那么您希望改进所花费的CPU周期,而不是局部变量所占用的空间。局部变量的数量对性能没有直接影响。如果在一个名为一百万次的非递归函数中去掉了一个8字节的局部变量,那么仍然只去掉了8字节,而不是8000000字节。这是错误的,它是按值传递的。即使它是一个引用类型,但它不是,它仍然是通过值传递的。DateTime是一个结构,所以不是通过引用传递的-除非有人在没有告诉我的情况下更改了C#?你是不正确的,DateTime是一个结构,因此是通过值传递的。释放堆栈上结构的不是GC。通过调整函数末尾的堆栈指针,这些函数被简单地“释放”,因此它们现在位于堆栈中未使用的部分。如果该方法在一行中被调用一百万次,该怎么办?这取决于何时为GC释放引用。如果它是短暂的,好吧,但是如果它被保持一段不可忽略的时间,裁判会不会有积极的影响?1)连续一百万次都不会有任何影响。你会得到同样的8字节一百万次。一百万次递归将是一个问题,但在C#中很少有深度递归函数。2) GC不参与其中。在堆栈上分配的本地
DateTime
不需要释放GC。当函数退出时,堆栈指针将被调整,所有真正的局部变量都将消失。这几乎是免费的如果局部变量不是真正的局部变量(lamda-capture、async-await、yield-iteratiors,…),它只会变得复杂,但这里不是这样。
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.