2012-07-24 3 views
1

malloc/free를 사용하는 것보다 (아마도) 빠른 메모리 할당기를 작성했습니다. 이 코드를 테스트하기 위해 적은 양의 코드를 작성했지만 이것이 메모리 할당자를 프로파일 링하는 올바른 방법인지 확실하지 않습니다. 아무도 저에게 조언을 해줄 수 있습니까?올바른 메모리 할당 자 프로파일 방법

이 코드의 출력은 다음과 같습니다

Mem_Alloc: 0.020000s 
malloc: 3.869000s 
difference: 3.849000s 
Mem_Alloc is 193.449997 times faster. 

코드입니다 :

int i; 
int mem_alloc_time, malloc_time; 
float mem_alloc_time_float, malloc_time_float, times_faster; 
unsigned prev; 

// Test Mem_Alloc 
timeBeginPeriod (1); 
mem_alloc_time = timeGetTime(); 

for (i = 0; i < 100000; i++) { 
    void *p = Mem_Alloc (100000); 
    Mem_Free (p); 
} 

// Get the duration 
mem_alloc_time = timeGetTime() - mem_alloc_time; 

// Test malloc 
prev = mem_alloc_time; // For getting the difference between the two times 
malloc_time = timeGetTime(); 

for (i = 0; i < 100000; i++) { 
    void *p = malloc (100000); 
    free (p); 
} 

// Get the duration 
malloc_time = timeGetTime() - malloc_time; 
timeEndPeriod (1); 

// Convert both times to seconds 
mem_alloc_time_float = (float)mem_alloc_time/1000.0f; 
malloc_time_float = (float)malloc_time/1000.0f; 

// Print the results 
printf ("Mem_Alloc: %fs\n", mem_alloc_time_float); 
printf ("malloc: %fs\n", malloc_time_float); 

if (mem_alloc_time_float > malloc_time_float) { 
    printf ("difference: %fs\n", mem_alloc_time_float - malloc_time_float); 
} else { 
    printf ("difference: %fs\n", malloc_time_float - mem_alloc_time_float); 
} 

times_faster = (float)max(mem_alloc_time_float, malloc_time_float)/
    (float)min(mem_alloc_time_float, malloc_time_float); 
printf ("Mem_Alloc is %f times faster.\n", times_faster); 
+0

'timeGetTime()'의 기능은 무엇입니까? – steffen

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757629(v=vs.85).aspx –

답변

0

아무도 관심 [*]을 할당 한 다음 할당과에서, 빠르게 또는 느리게 자신의 할당보다 여부 100k 블록을 즉시 100k 번 해제합니다. 이것은 일반적인 메모리 할당 패턴이 아니며, 발생하는 상황에 따라 메모리 할당자를 사용하는 것보다 최적화하는 것이 더 좋은 방법입니다 (예 : alloca을 통해 스택을 사용하거나 정적 배열을 사용).

사람들은 할당자가 자신의 응용 프로그램의 속도를 향상시킬 수 있는지 여부에 크게 신경을 썼습니다.

실제 응용 프로그램을 선택하십시오. 두 명의 서로 다른 할당자를 통해 할당 작업이 많은 작업에서 성능을 연구하고이를 비교하십시오. 그런 다음 더 많은 할당 작업을 수행하십시오.

예를 들어 Firefox를 시작하고 StackOverflow 프론트 페이지를로드하는 시간을 비교해보십시오. 테스트에서 임의의 변형을 많이 제거하기 위해 네트워크를 조롱하거나 적어도 로컬 HTTP 프록시를 사용할 수 있습니다. 또한 프로파일 러를 사용하여 malloc에 소요 된 시간을 확인하고 작업이 할당량이 많은지 여부에 관계없이 "과다 커밋"과 같은 내용이 모든 메모리 할당 비용이 지불되지 않는다는 것을주의하십시오. malloc .

자신의 응용 프로그램 속도를 높이기 위해 할당자를 작성한 경우 자신의 응용 프로그램을 사용해야합니다.

주의 할 점 중 하나는 할당 자에서 사람들이 자주 원하는 것은 최악의 경우에 좋은 행동입니다. 즉, allocator가 기본값 인 대부분의 시간보다 99.5 % 더 빠르지 만 메모리가 조각난다면 비교적 나쁘게 끝나면 결국 실패하게됩니다. 왜냐하면 Firefox가 몇 시간 동안 실행되기 때문입니다. 더 이상 메모리를 할당 할 수없고 넘어지지 않습니다. 그렇다면 사소한 일로 보이는 것보다 오랜 시간이 걸리는 이유를 알 수 있습니다.

[*] 가혹하게 보일 수 있습니다. 아무도는 ;-) 거친인지 관심이 없다

+0

답장을 보내 주시면 감사하겠습니다. :) –

+0

내 할당자가 블록을 해제 할 때마다 그 블록의 infront 블록을 살펴본 후 그 블록도 infree 블록을 병합하면 어느 정도까지 조각화를 중지해야합니다. –

0

이전에 하나를 튀김으로하면 패킷의 현재 크기가 동일 할 경우 확인하고 있습니다 행방 불명에 대해 테스트하는 모든 구현 :

if(size == prev_free->size) 
{ 
    current = allocate(prev_free); 
    return current; 
} 

효율적으로 할 "사소한"입니다 메모리가 조각화되지 않을 때까지 메모리에 대한 malloc/free 함수. 도전은 당신이 다른 크기의 많은 메모리를 할당 할 때 당신은 어떤 것을 자유롭게하려고 시도하고 어떤 특정한 순서없이 오순절을 할당하려고합니다.

테스트 한 라이브러리와 해당 라이브러리가 최적화 된 조건을 확인해야합니다.

  • 드 조각난 메모리 처리 효율
  • 빠른 무료, 고속의 malloc (당신이 할 수있는 하나의 O (1) 중 하나),
  • 메모리 풋 프린트
  • 멀티 프로세서 지원
  • realloc을

기존 구현 및 문제를 점검하고 부작용을 개선하고 해결하려고 시도합니다. 사용자가 라이브러리에서 기대하는 바를 찾아보십시오.

중요한 가정이라고 생각되는 작업뿐만 아니라 이러한 가정을 테스트 해보십시오.