2010-12-06 5 views
1

n00bish 질문에 대해 용서해주십시오. 이 10 번 반복하고 SampleClass의 예를 들어 새로운 메모리 공간을 할당 것, 주어진 예제 코드에서객체 메모리 최적화 질문

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()가 호출 될 때마다 시간을 할당합니다 :

다음 코드를 고려하시기 바랍니다 objSample 개체입니다.

궁금,

  • 이 메모리 공간을 많이가 그것으로 낭비되는 등 나쁜 방법 인 경우? 그런 경우

  • 의 할당 된 메모리를 최적화/재사용 할 수있는
    더 나은 방법이있다?

아니면, 아무런 이유없이 불필요한 미세 최적화 모드로 들어가는 것에 대해 걱정하고 있습니까? :)

편집 : 또한 이러한 방법이 멀티 스레드 환경에서 사용되는 경우를 생각해보십시오. 그게 아무것도 바꿀까요?

답변

4

당신이 무엇을하고 있는지에 대한 기술적 인 용어 당신은 확실히 잘하고있는 조기 최적화

입니다)

"조기 최적화는 모든 악의 뿌리입니다"또는 그래서 그들이 말하는 기억 사물의 성능에 대한 영향을 생각해보십시오. 그러나이 경우 .NET 가비지 수집기가 메모리를 잘 처리합니다. .NET은 객체를 빠르게 생성하는 데 아주 좋습니다.

클래스의 생성자가 복잡하고 많은 시간을 소비하지 않는 한 큰 문제는 아닙니다.

+0

멀티 스레드 방식의 경우에도 응답이 동일하게 유지됩니까? –

+0

물론입니다. 실제로, 멀티 스레딩을 할 때 각 스레드에 대해 서로 다른 데이터 세트를 가질 수 있다면 MT 프로그래밍이 더 쉬워집니다. 그러나 반복 할 항목 모음이 있고 각각에 대해 처리를 수행해야하는 경우 - 인스턴스간에 데이터가 공유되지 않는 경우 - 멀티 스레딩은 잘 작동합니다 (.NET에는 새로운 병렬 모델이 있습니다. 일종의)도 –

3

두 번째 옵션.

성능 문제가있는 경우가 아니면 이러한 종류의 최적화에 신경 쓰지 않아도됩니다.

심지어 오브젝트를 저장 한 후에 ObjSampleHandler()에서 오브젝트를 나중에 사용하도록 저장 한 경우와 같이 오브젝트를 작성한 후에 오브젝트를 사용하면 오브젝트의 용도에 따라 다르지만, 하고있어.

+0

음, ObjSampleHandler는 objSample의 정보를 처리하고 Collection 객체의 일부 값을 설정하는 것입니다. 기본적으로 objSample은 나중에 필요하지 않습니다. –

+0

좋습니다. 그러나 이것은 초기 최적화이며 걱정할 필요가 없습니다. 게다가, 당신이 지금하고있는 방식은 이제 더 명확한 방식으로 의도를 보여 주므로 (당신은 매번 다른 객체를 처리하고 있습니다) 따라서 반복 할 때마다 객체를 생성하는 것이 더 읽기 쉽다고 생각합니다. 그래도 내 의견. – willvv

1

새 개체 (objSample = new SampleClass();)를 만들 때 해당 개체를 다시 사용하지 않습니다. SampleClass 인스턴스에 대한 참조 만 다시 사용하고 있습니다.

하지만 이제는 그 참조가 클래스 Sample의 메소드의 로컬 변수가 될 수있는 클래스 프로그램의 멤버 변수가되어야합니다.

+0

좋은 지적. 이 필드를 로컬 변수로 리팩토링하면 프로그램을 더 쉽게 수행 할 수 있습니다. – Steven

+0

예, 저는 동일한 객체를 재사용하지 않고 있습니다.하지만 재사용하면 성능을 향상시킬 수 있는지 알고 싶습니다. 그렇다면 재사용을위한 접근 방법은 무엇입니까? 'SampleClass'에서 멤버의 값을 재설정하기 위해 메소드를 작성하거나 다른 사람들이 제안한 것처럼 과도 함이 될 수 있습니다. 감사합니다. –

0

ObjSampleHandler 메서드의 코드가 objSample에 대한 로컬이 아닌 참조를 만들지 않는다면 메서드가 완료되면 개체가 가비지 수집 대상이되고 이는 메모리 효율이 좋고 걱정할 필요가 없습니다. 그러나이 유형의 코드로 인해 관리되는 힙에 특별히 문제가있는 경우 클래스를 struct으로 변경할 수 있으며 더 효율적 인 힙이 아닌 스택에 저장됩니다. 구조체는 참조가 아닌 값으로 복사되지만 코드의 나머지 부분에서는 구조체의 결과를 이해해야합니다.

+0

딘 감사합니다,하지만이 상황을 설명하기위한 샘플입니다. 실제로 구현할 때는 클래스 만 사용해야합니다. –