Вопрос оптимизации памяти объекта - PullRequest
1 голос
/ 06 декабря 2010

Прошу прощения за нерешительный вопрос.

Пожалуйста, рассмотрите следующий код:

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 ]

4 голосов
/ 06 декабря 2010

Технический термин для того, что вы делаете: преждевременная оптимизация

Вы определенно преуспеваете, чтобы думать о влиянии на производительность вещей. Но в этом случае сборщик мусора .NET будет нормально обрабатывать память. И .NET очень хорош для быстрого создания объектов.

Пока конструктор вашего класса не делает много сложных, трудоемких вещей, это не будет большой проблемой.

3 голосов
/ 06 декабря 2010

Второй вариант.

Вы не должны беспокоиться об этом виде оптимизации, если у вас нет проблем с производительностью.

И даже если это так, это будет зависеть от того, что вы будете делать с объектом после его создания, например, если в ObjSampleHandler () вы сохраняете объекты, чтобы использовать их позже, вы просто не можете избежать того, что делаешь.

Помните, "ранняя оптимизация - корень всего зла" или, как они говорят;)

1 голос
/ 06 декабря 2010

Когда вы создаете новый объект (objSample = new SampleClass();), вы не используете этот объект повторно.Вы только повторно используете ссылку на экземпляр SampleClass.

Но теперь вы заставляете эту ссылку быть переменной-членом вашего класса Program, где она могла быть локальной переменной метода SampleMethod.

0 голосов
/ 06 декабря 2010

Предполагая, что ваш код в методе ObjSampleHandler не создает нелокальных ссылок на objSample, объект станет пригодным для сборки мусора после завершения метода, что будет весьма эффективно с точки зрения памяти и вряд ли будет представлять проблему. Однако, если у вас возникают проблемы именно с управляемой кучей из-за этого типа кода, вы можете изменить свой класс на struct, и он будет храниться в стеке, а не в куче, что более эффективно. Пожалуйста, помните, что эти структуры копируются по значению, а не по ссылке, и вы должны понимать последствия этого в оставшейся части кода.

public struct SampleClass
{
    public string sampleString { get; set; }
    public int sampleInt { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...