内存传递方法参数的最佳方法

本文关键字:方法 最佳 参数 内存 | 更新日期: 2023-09-27 18:31:30

我的代码遇到了一些内存性能问题,我不确定哪种方法是将参数传递给我的方法的最佳方法。我将举一个简短的例子。

例如,我有这个类:

class Person
{
    public string Name { get; set; }
    public bool IsMale { get; set; }
    public string Address { get; set; }
    public DateTime DateOfBirth { get; set; }
}

然后我像这样使用它:

    static void Main(string[] args)
    {
        Person person = new Person {
            Name = "John",
            Address = "Test address",
            DateOfBirth = DateTime.Now,
            IsMale = false };
        int age = CalculateAge(person);
        int age2 = CalculateAge(person.DateOfBirth);
    }
    private static int CalculateAge(Person person)
    {
        return (DateTime.Now - person.DateOfBirth).Days;
    }
    private static int CalculateAge(DateTime birthDate)
    {
        return (DateTime.Now - birthDate).Days;
    }

现在在我的应用程序中,我有很多方法调用,其中整个对象(具有许多属性的对象,不像我示例中的"Person"对象)作为参数传递,我正在考虑通过仅向方法发送他们需要的属性来改进代码,但目前我不确定这将如何提高内存性能。

关于内存使用情况,将整个 Peron 对象发送到我的方法(如 CalculateAge(person);)或仅将用于CalculateAge(person.DateOfBirth);的方法的属性发送到方法中,这如何更好?

首先,我认为像这样的调用CalculateAge(person.DateOfBirth);(仅将所需的属性而不是整个对象作为参数发送)使用更少的内存,但最终经过测试,我注意到应用程序执行速度较慢,现在我不确定这些更改或其他更改是否减慢了我的应用程序。

内存传递方法参数的最佳方法

这里有三种情况需要考虑:

  1. 传递一个class对象与另一个class对象
  2. 传递struct值与class对象
  3. 传递多个class/struct秒与单个class

在内存方面,只有第一种情况将是平等的交易:传递string Name所需的内存与传递Person person所需的内存一样多。

传递struct(如 DateTime)可能会占用更多内存或更少内存,具体取决于struct的大小。对于DateTime,大小(当前)为八个字节。对于较小的按值对象,例如具有单个shortstruct,您将需要更少的字节。对于较大的struct,例如 DateTimeOffset,您将需要更多的字节。

在大多数情况下,传递

多个对象或值比传递单个class对象需要更多的内存。唯一的例外是通过几个非常小的struct

在决定策略之前,除了考虑内存影响之外,还应考虑 API 的逻辑结构。

Person传递给计算年龄的 API 会在年龄计算 API 和Person之间创建依赖关系。另一方面,单独传递 DOB 会在 Person 和 API 的调用方之间创建依赖关系。

如果您计划专门对Person对象使用年龄计算 API,则传递Person是有意义的。此外,应考虑将计算属性直接添加到 Person 类中,

另一方面,如果您计划将年龄计算 API 用于其他对象(动物、建筑物等),则最好传递 DOB。

基本上,如果我没有完全错,这应该无关紧要。传递给该方法的所有内容都是指向对象的指针,该指针在 64 位计算机上为 8 字节(请参阅此处)。

只有当你能减少你传递的对象数量(n乘以8字节)时,它应该会有所作为,但这在"标准应用程序"中也不应该成为问题。

编辑:正如@Bashn指出的那样,DateTime 是一个结构体,因此在方法调用时完全复制到堆栈中。然而,在这种情况下这并不重要,因为日期时间是 8 个字节大。根据给定结构的大小,这可能会给方法调用带来或多或少的开销。

尽管如此,传递参数不应该导致内存问题。你是如何发现你的记忆问题的?