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

时间:2016-01-21 18:59:11

标签: c# .net memory

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

我有这样的课程:

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;
    }

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  1. 传递class对象与另一个class对象
  2. 传递struct值与class对象
  3. 传递多个class / struct s与单个class
  4. 就记忆而言,只有第一种情况是平等交易:传递string Name需要尽可能多的内存来传递Person person

    传递struct,例如DateTime,可能需要更多内存或更少内存,具体取决于struct的大小。对于DateTime,大小(当前)为8个字节。对于较小的按值对象,例如struct只有一个short,您需要更少的字节。对于较大的struct s,例如DateTimeOffset,您需要更多字节。

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

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

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

    如果您计划仅使用年龄计算API与Person个对象,那么传递Person是有道理的。此外,您应该考虑将计算属性直接添加到Person

    另一方面,如果您计划将年龄计算API与其他对象(动物,建筑物等)一起使用,那么最好通过DOB。

答案 1 :(得分:1)

基本上,如果我不是完全错了,这应该不重要。 传递给该方法的所有内容都是对象的指针,它在64位计算机上为8字节(请参阅here)。

如果你可以减少你传递的对象的数量(n次为8个字节),它应该只会有所不同,但这也不应该是“标准应用程序”中的问题。

编辑: 作为@Bashn pointet out,DateTime is a struct并且因此在方法调用时完全复制到堆栈。但在这种情况下并不重要,因为DateTime大8字节。根据给定结构的大小,这可能会对方法调用产生或多或少的开销。

但是,传递参数不应该导致内存问题。 你是怎么发现自己的记忆问题的?