2010-03-04 3 views
2

모바일 장치에서 많은 객체 인스턴스화 (초 당 40k)를 처리하는 패턴이 있습니까? 나는이 객체들을 따로 필요로하고 결합 될 수 없다. 객체의 재사용은 아마도 해결책 일 것입니다. 어떤 힌트?C++에서 방대한 객체 생성

+0

C++ 및 iPhone? 확실합니까? 목표 -C와 아이폰? C++과 심비안? –

+0

@Tadeusz - Objective-C는 C++과 인터페이스 할 수 있으므로 iPhone 용 C++로 작성하는 것이 매우 간단합니다. –

+0

@Tafeusz : 네, C++을 말합니다. 레거시 코드는 종종 iPhone에서 완벽하게 실행되는 C++로 작성됩니다. – Sney

답변

3

내가 당신을 생각 이러한 디자인 패턴을 고려할 수 :

  • 개체 풀
  • 공장

Further info

나는 희망도이 도움말 당신 : 나는 프로그래밍 확률 적 반응 - 확산 시스템 (데스크톱 컴퓨터에 초당 객체 창조물의 수백만)과 실시간 이미지와 유사한 패턴을 사용했습니다 Object Pooling for Generic C++ classes

7

예. 가능한 한 오래된 객체를 풀에 보관하고 다시 사용하십시오. 메모리 할당 및 삭제 비용으로 인해 많은 시간을 절약 할 수 있습니다.

2

객체가 모두 같은 크기 인 경우, 무료 노드의 관입 연결리스트와 간단한 세포 할당하려고 : 할당 및 해방은 모두 단일 스레드에서 수행하는 경우

free: 
    add node to head of list 

allocate: 
    if list is non-empty: 
     remove the head of the list and return it 
    else: 
     allocate a large block of memory 
     split it into cells of the required size 
     add all but one of them to the free list 
     return the other one 

하면, 당신은 돈을 ' 어떤 동기화가 필요하지 않습니다. 만약 그들이 다른 스레드에서 완료되면 초 당 40k 컨텍스트 스위치가 초 당 40k 할당보다 큰 걱정이됩니다 ;-)

셀을 "원시 메모리"로 만들 수 있습니다. 클래스에 대한 새로운 과부하 연산자)를 사용하거나 객체가 "자유 목록"에 있더라도 항상 초기화 된 상태로 유지하고 필요한 모든 값을 "새"멤버에 할당합니다. 당신이하는 일은 비싼 초기화가 얼마나 중요한가에 달려 있으며 아마도 셀 할당 자와 객체 풀 간의 기술적 차이 일 것입니다.

1

자세한 정보없이 코드를 개선하는 방법은 정확히 말하기 어렵지만, Boost Pool 라이브러리를 확인하고 싶을 것입니다. 이들 모두는 서로 다른 특정 사용 사례에 대해 신속하게 메모리를 할당하는 다양한 방법을 제공합니다. 유스 케이스에 가장 적합한 것을 선택하십시오.

0

객체가 같은 크기 인 경우, 당신은 메모리의 큰 덩어리를 할당 할 수 있으며 모든 연속 메모리에있을 것 같은 할당 비용으로 도움이 될 것입니다 placement new을 사용

Object *pool = malloc(sizeof(Object) * numberOfObjects); 
for(int i=0; i<numberOfObjects; i++) 
    new (&pool[i]) Object() 
0

처리 (다시 말하면, 수십만 또는 수백만/초). 다음과 같이

기본 개념은 다음과 같습니다

  • 가 원하는 개체의 큰 배열을 할당하는 할당을 만들기; 이 객체에 "다음"포인터가 있어야합니다 (보통 다음 포인터로 객체를 래핑하는 템플릿을 만듭니다).
  • 개체가 필요할 때마다 호출자가 호출 한 메모리 블록에서 초기화하는 new-syntax를 사용하여이 할당자를 가져옵니다.
  • 끝날 때마다 할당 자에게 돌려주고 스택에 놓습니다.
  • allocator는 스택이 비어 있지 않으면 스택에서 뭔가를 제공하고 그렇지 않으면 배열 버퍼에서 뭔가를 제공합니다.버퍼가 부족한 경우 다른 큰 버퍼를 할당하고 기존의 사용 된 노드를 복사하거나 할당자가 완전히 사용되는 할당 블록 스택을 유지하도록 할 수 있습니다.
  • 모든 개체를 다 끝내면 할당자를 삭제하십시오. 부작용 : 각 개별 객체를 해제 할 필요는 없습니다. 그들은 모두 떠날거야. Side cost :이 임시 버퍼 대신 힙에 영원히 보존하려는 항목을 할당하는 것이 좋습니다 (또는 영구 버퍼를 사용하는 것이 좋습니다).

이 접근법을 사용할 때 일반적으로 원시 malloc/new보다 약 10 배의 성능을 얻습니다.

2

개체가 중복되는 경우 플라이 웨이트 패턴을 사용할 수 있습니다. 이 패턴은 유사한 객체간에 메모리를 공유합니다. 고전적인 예는 워드 프로세싱 프로그램에서 문자의 그래픽 표현에 사용되는 데이터 구조입니다.

위키 백과는 summary입니다.

부스트가 implementation입니다.