2010-12-06 6 views
1

Прошу простить меня за вопрос n00bish.Вопрос об оптимизации памяти объекта

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

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

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

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

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

+0

Будет ли ответ оставаться прежним даже для многопоточного подхода? – 2010-12-07 02:52:36

+0

Абсолютно. Фактически, при многопоточности, если вы можете иметь отдельный набор данных для каждого потока, это облегчает программирование MT. Но если у вас есть, скажем, набор элементов, которые нужно перебирать и выполнять некоторую обработку на каждом из них - где данные не разделяются между экземплярами - многопоточность хорошо работает для этого (и .NET имеет новую параллельную модель для этого вид вещи тоже) – 2010-12-07 10:51:34

3

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

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

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

Помните, что «ранняя оптимизация есть корень всех зол», так они говорят;)

+0

Ну, давайте скажем, ObjSampleHandler просто обрабатывает данные в objSample и установки какое-то значение в объекте Collection .. в основном на Isnt objSample требуемый позже. – 2010-12-06 12:11:11

+0

Хорошо, но это ранняя оптимизация, и вы не должны беспокоиться об этом. Кроме того, способ, которым вы сейчас это делаете, показывает намерение более четким способом (каждый раз вы обрабатываете другой объект), поэтому я считаю, что лучше читать, имея объект, созданный с каждой итерацией. Просто мое мнение. – willvv 2010-12-06 12:16:20

1

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

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

0

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

public struct SampleClass 
{ 
    public string sampleString { get; set; } 
    public int sampleInt { get; set; } 
} 
Смежные вопросы