结构中的方法是否会对C#中的内存大小或性能产生负面影响? 目标简介:

结构中的方法是否会对C#中的内存大小或性能产生负面影响? 目标简介:,c#,performance,memory,methods,struct,C#,Performance,Memory,Methods,Struct,我目前正在尝试优化代码的性能和内存使用。(主要是Ram瓶颈) 程序将同时具有以下元素的多个实例。尤其是当历史价格应以尽可能快的速度处理时。 结构以最简单的方式如下所示: public结构PriceElement { 公共日期时间点时间{get;set;} 公共十进制买入价{get;set;} 公共十进制SellPrice{get;set;} } 我意识到像使用空瓶子一样使用struct的性能优势,并在用完后重新填充它。这样,我就不必为行中的每个元素重新分配内存 然而,这也使得我的代码对于程序代

我目前正在尝试优化代码的性能和内存使用。(主要是Ram瓶颈)

程序将同时具有以下元素的多个实例。尤其是当历史价格应以尽可能快的速度处理时。 结构以最简单的方式如下所示:

public结构PriceElement
{
公共日期时间点时间{get;set;}
公共十进制买入价{get;set;}
公共十进制SellPrice{get;set;}
}
我意识到像使用空瓶子一样使用struct的性能优势,并在用完后重新填充它。这样,我就不必为行中的每个元素重新分配内存

然而,这也使得我的代码对于程序代码中的人为错误更加危险。也就是说,我想确保我总是一次更新整个结构,而不是因为忘记更新元素而只更新sellprice和buyprice

元素非常整洁,但我必须将方法卸载到另一个类中的函数中,以获得我所需的功能-这反过来会变得不那么直观,因此在代码中也不太可取

因此,我添加了一些基本方法,使我的生活更加轻松:

public struct PriceElement
{
    public PriceElement(DateTime spotTime = default(DateTime), decimal buyPrice = 0, decimal sellPrice = 0)
    {
        // assign datetime min value if not happened already
        spotTime = spotTime == default(DateTime) ? DateTime.MinValue : spotTime;
        this.SpotTime = spotTime;
        this.BuyPrice = buyPrice;
        this.SellPrice = sellPrice;

    }
    // Data
    public DateTime SpotTime { get; private set; }
    public decimal BuyPrice { get; private set; }
    public decimal SellPrice { get; private set; }
    // Methods
    public decimal SpotPrice { get { return ((this.BuyPrice + this.SellPrice) / (decimal)2); } }
    // refills/overwrites this price element
    public void UpdatePrice(DateTime spotTime, decimal buyPrice, decimal sellPrice)
    {
        this.SpotTime = spotTime;
        this.BuyPrice = buyPrice;
        this.SellPrice = sellPrice;
    }
    public string ToString()
    {
        System.Text.StringBuilder output = new System.Text.StringBuilder();
        output.Append(this.SpotTime.ToString("dd/MM/yyyy HH:mm:ss"));
        output.Append(',');
        output.Append(this.BuyPrice);
        output.Append(',');
        output.Append(this.SellPrice);
        return output.ToString();
    }
}
问题: 假设我有
PriceElement[1000000]
-这些额外的方法会对系统内存造成额外的压力,还是在PriceElement类型的所有结构之间“共享”

这些额外的方法是否会分别增加创建
新PriceElement(DateTime、buy、sell)
实例的时间和垃圾收集器的负载

会不会有负面影响,我在这里没有提到

这些额外的方法会给系统内存带来额外的压力,还是在PriceElement类型的所有结构之间“共享”

代码在所有实例之间共享。因此,不会使用额外的内存

代码与任何数据分开存储,代码的内存仅取决于代码的数量,而不是对象实例的数量。对于类和结构都是如此。主要的例外是泛型,这将为使用的每个类型组合创建代码的副本。由于代码是JIT的、缓存的等等,所以它有点复杂,但是在大多数情况下这是不相关的,因为您无论如何都无法控制它


我建议将结构设置为不可变。例如,更改
UpdatePrice
,因此它返回一个新结构,而不是更改现有结构。有关详细信息,请参阅。使结构不可变允许您将结构标记为只读,这有助于在传递带有。在现代C语言中,你可以使用,这也有助于避免拷贝(如你所知道的)。微软建议结构有一个,而你的是一个惊人的40字节,所以任何节省的分配成本可能都比复制它的成本要小。如果您真的关心效率,并且非常关心使其成为一个结构而不是一个类,那么您需要提高性能更改为类会使代码性能降低一个>2.x-4.x的系数-经过反复试验和测试,结构变得非常好,很高兴您在分析:)特别是使用ref关键字,没有太多的抄袭。但是感谢您的建议。代码在内存中只存在一次,而数据成员在每个实例中复制一次,这就是驱动结构的内存需求的原因。方法、属性、构造函数和所有这些代码都不会影响程序的内存需求。嘿,乔纳斯,谢谢你的回答@julianbechtold或重新表述最后一段中的意思:如果结构是不可变的,JIT可以将参数中的
替换为
ref
,知道指针不能改变。这可以防止大型结构的复制,并有效地使它们成为堆栈指针。你可以用数组做同样的事情。