2012-10-10 2 views
1

나는 C#에서 나중에 다른 응용 프로그램에서 사용할 스택에 대한 정보를 저장하는 클래스가 있습니다. 이 정보는 현재 (어떤 메소드도없이) 클래스에 저장되어 있으며 int, shorts, float 및 몇 개의 부울 값으로 구성됩니다. 매초마다 10-40 개의 패킷을 처리 할 수 ​​있습니다. 잠재적으로 더 많은 정보를 얻을 수 있습니다. 스택의 정보는 프로그램의 다른 부분에서 필요할 때 제거됩니다. 그러나 이는 일정한 간격으로 발생하는 것이 보장되지는 않습니다. 또한 정보가 불완전해질 수 있습니다 (네트워크 연결에서 패킷을 처리 중입니다). 현재 나는이 같은 표현했다 :효율적인 임시 데이터 세트

public class PackInfo 
{ 
    public boolean active; 
    public float f1; 
    public float f2; 
    public int i1; 
    public int i2; 
    public int i3; 
    public int i4; 
    public short s1; 
    public short s2; 
} 

이 정보를 표시 할 수있는 더 좋은 방법이 있나요? 스택이 너무 커질 가능성은 없습니다 (너무 커지면 대부분의 정보가 지워질 것입니다).하지만 많은 클래스의 인스턴스를 생성하는 데 필요한 메모리 오버 헤드가 불필요하게 많아 질 것으로 걱정됩니다. 이 정보를 담는 컨테이너 라기보다는 계산적으로 복잡하거나 메모리를 많이 사용하는 작업이 아니지만 어느 쪽이 될지라도 잘 조정되지는 않습니다.

답변

4

일반용 Queue을 저장하는 것이 좋습니다. 나는 당신이이 "메시지"를 순서대로 다루고 있다고 가정합니다.

이러한 클래스를 인스턴스화하는 오버 헤드에 대해서는 초당 10-40을 인스턴스화하면 성능에 눈에 띄는 영향을 미치지 않을 것이라고 생각합니다. 실제로 수행하는 실제 처리는 최적화보다 훨씬 더 나은 후보가 될 것입니다. 인스턴스화 비용.

또한 애플리케이션에서 실제로 성능을 측정 할 수있을 때만 최적화하는 것이 좋습니다. 그렇지 않으면 조기 최적화를 수행하는 데 시간을 낭비 할 수 있습니다.

+0

측정이 가능할 지 궁금했지만 현재 구현에 대해 그렇게 걱정하지 않았습니다. 나는 그것이 어떻게 확장 될지에 대해 더 염려했다. ​​가비지 콜렉션은 할당 된 메모리를 재사용 할 것인가, 아니면 가려 내는가? 이 대답은 호기심을 만족 시켰습니다. 감사합니다! –

+0

가비지 수집은 시스템이 필요할 때만 메모리를 비 웁니다. 높은 메모리 시스템을 사용하는 경우 개체가 수천 개가 될 때까지 오래된 개체를 수집하지 못할 수 있습니다. 메모리 재사용에 관해서는 이미 .NET 프레임 워크가 Windows apis를 호출하여 큰 덩어리 (아마도'VirtualAlloc'을 사용하는)의 프로세스에 메모리를 할당하고, 그 프로세스를 세그먼트 화하는 것입니다 의미있는 방식으로 기억하십시오. 가비지 콜렉션이 실행될 때, 모든 메모리를 OS로 반환하지는 않습니다. – Matthew