对象内存优化问题

时间:2010-12-06 12:04:53

标签: c# .net optimization memory-management

请原谅我提出一个难以理解的问题。

请考虑以下代码:

public class SampleClass
{
    public string sampleString { get; set; }
    public int sampleInt { get; set; }
}


class Program
{
    SampleClass objSample;


    public void SampleMethod()
    {
        for (int i = 0; i < 10; i++)
        { objSample = new SampleClass();
            objSample.sampleInt = i;
            objSample.sampleString = "string" + i;

            ObjSampleHandler(objSample);
        }
    }

    private void ObjSampleHandler(SampleClass objSample)
    {
       //Some Code here
    }
}

在给定的示例代码中,每次调用SampleMethod()时,它将迭代10次并为SampleClass的实例分配新的内存空间并将分配给objSample对象。

我想知道,

  • 如果这是一个很糟糕的方法 记忆空间被浪费了吗?

  • 如果是这样的话,有没有 更好的重用/优化方法 分配内存?

或者,我是否完全没有理由担心并进入不必要的微优化模式? :)

编辑:还要考虑在多线程环境中使用此类方法时的情况。这会改变什么吗?

4 个答案:

答案 0 :(得分:4)

您正在做的技术术语是过早优化

考虑事物的性能影响,你肯定做得很好。但在这种情况下,.NET垃圾收集器将处理内存很好。 .NET非常擅长快速创建对象。

只要你的类的构造函数没有做很多复杂,耗时的事情,这不会是一个大问题。

答案 1 :(得分:3)

第二个选项。

除非遇到性能问题,否则不应该关注这种优化。

即使你是,它也取决于你在创建对象之后对对象所做的事情,例如,如果在ObjSampleHandler()中存储对象以便以后使用它们,你根本无法避免你的意思做的。

请记住,“早期优化是所有邪恶的根源”,所以他们说;)

答案 2 :(得分:1)

在创建新对象(objSample = new SampleClass();)时,您不会重复使用该对象。您只是重用对SampleClass实例的引用。

但现在你强迫该引用成为类Program的成员变量,它可能是方法SampleMethod的局部变量。

答案 3 :(得分:0)

假设ObjSampleHandler方法中的代码不会创建对objSample的任何非本地引用,一旦方法完成,该对象将有资格进行垃圾收集,这将非常有效,并且不太可能引起关注。 但是,如果您因为这种类型的代码而特别遇到托管堆问题,那么您可以将类更改为struct,它将存储在堆栈而不是更有效的堆上。请记住,虽然结构是按值而不是引用复制的,但您需要在代码的其余部分中理解这种结果。

public struct SampleClass
{
    public string sampleString { get; set; }
    public int sampleInt { get; set; }
}