2011-04-07 5 views
0

직렬화 시스템의 경우 데이터를 쓰는 버퍼를 할당해야합니다. 필요한 크기는 미리 알 수 없기 때문에 기본 패턴은 mallocN 바이트이며 더 필요한 경우 realloc을 사용하십시오. N의 크기는 대부분의 오브젝트를 수용 할만큼 충분히 커서 재 할당이 거의 발생하지 않습니다.중간 크기 메모리 할당에 적합한 크기는 무엇입니까?

이렇게하면 malloc이 다른 것보다 더 쉽게 만족할 수있는 최적의 초기 바이트 량이 있다고 생각했습니다. pagesize에 가까운 어딘가에서 추측하고 있지만, 정확히 말하면 malloc에 가사를위한 공간이 필요한 경우는 없습니다.

지금은 쓸모없는 최적화라고 확신합니다. 정말로 중요하다고 생각하면 수영장을 사용할 수 있지만 궁금합니다. 나는 처음 프로그래머가 될 수 없다. 바이트의 어떤 부분이든 나에게 가장 쉽게 할당 할 수있는 것은이다. 이것을 결정할 방법이 있습니까?

현대 GCC/G ++ 및/또는 Linux에 특별히 적용되는 답변이 허용됩니다.

+0

최적화 자체는 쓸모가 없지만 구체적인 필요성이 생길 때까지 최적화를 기다려야할까요? 또는 당신은 당신의 손에 너무 많은 시간이 있습니까? :-) –

+0

@ 앤더스 :이 시간을 내 자신이 연구하는데 시간을 낭비 할 수 있습니다. 내가 궁금한 점이 있다면 시간이 너무 효율적이라고 대답 할 수 있습니다. – porgarmingduod

+1

@Anders K : 최적화 문제에 대한 질문이있는 대다수의 포스터가하지 말아야 할 일에 대해 의견을 묻는 것이 제 경험입니다. . –

답변

-1

유사한 경우에 수행되는 방식은 첫 번째 malloc이 대부분의 경우 (설명 된대로)에 적합 할 정도로 크고 크지 않은 청크를 할당하고 이후에 요청 된 크기를 두 배로 늘리는 전화 realloc을 할당하는 것입니다.

그래서 처음에 100을 할당하면 다음에 realloc 200, 400, 800 등등이됩니다. 이 방법으로 후속 재배포의 기회는 매번 당신이 그것을 할 때마다 낮아질 것입니다.

메모리가 맞으면 나를 std::vector라고 부릅니다. 편집

최적의 초기 할당 크기는 한쪽에 당신의 대부분의 경우를 다룰 것 하나가 될 것이다, 그러나 다른 측면에서 너무 낭비되지 않습니다 후

. 평균 케이스가 50이지만 스파이크가 500 인 경우 처음에 50을 배정하고 다음에 realloc 번을 두 배 또는 세 배 (또는 배수를 10 배) 할당하여 1-3에서 realloc 초에 500을 얻을 수 있습니다. 그러나 더 이상 realloc 일 것 같지도 드문 경우도 있습니다. 따라서 기본적으로 사용 패턴에 따라 다릅니다.

+0

나는이 접근법을 매우 잘 알고있다. 그것은 전체적으로 __ 초기 크기를 결정하는 것과 관련된 질문을 전혀 다루지 않습니다 __. – porgarmingduod

+0

그래, 그 두 센트를 추가했지만 왜 최적화를 찾고 있는지 언급하지 않았으므로 메모리를 낭비하고 싶지 않기 때문에 추측하고 있습니다. 최적화하고 싶은 것이 있습니까? – littleadv

+0

질문은 중형 크기 __malloc이 가장 효율적으로 처리 할 수있는 것을 알 수 있는지 여부입니다. 사용 패턴, 즉 내가 실제로 필요로하는 크기는'pagesize'가 아마 괜찮을 것이라는 점을 제외하고는 질문의 일부가 아닙니다. – porgarmingduod

2

this wiki 페이지에서 당신의 대답은 사용중인 malloc과 OS에 따라 크게 달라질 것 같습니다. OpenBSD의 malloc에서 비트를 읽는 것은 특히 흥미 롭습니다. mmap을보고 싶은 것 같지만, 기본 페이지 크기 (4096?)를 할당하는 것이 최적화 될 것이라고 추측합니다.

+0

사실, 이것에 대한 실험 결과를 알고 싶습니다. 어쩌면 4095 바이트 x 배를 할당하고 타이밍 평균이 어떻게 보이는지 확인한 다음 4096 바이트와 4097 바이트로 동일한 실험을 수행 할 수 있습니다. 페이지 크기를 4KB로 설정하고 각 테스트 전에 컴퓨터를 다시 시작하려고 할 수 있습니다. 어떤 사람? :-) – Adam

1

내 제안은 malloc/realloc/free 소스 코드를 찾아서 동일한 소스 모듈에서 (다른 메모리 구조와 함께) 자신의 "malloc_first"를 구현할 수 있다는 것입니다 전달 된 minimum_bytes 매개 변수보다 크거나 같은 첫 번째 사용 가능한 블록을 리턴합니다. 0이 통과되면 첫 번째 블록 기간이 시작됩니다.

적절한 선언은

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes); 

이 같은 사업이 될 것이다 어떻게 가능 하죠 나도 몰라 수 있습니다. 모든 소스 코드를 사용할 수있는 Linux를 사용해 보시기 바랍니다.

+0

예, 그렇습니다. 그러나이 시점에서 나는 단순히 메모리 풀 (전문가 구현이 이미 가능함)과 그 위에 간단한 할당 정책을 사용하는 것이 훨씬 낫다. 그러나 "자신을 제어하십시오"라는 일반적인 제안은 아마도 자리에 올 것입니다. – porgarmingduod