memory allocation/deallocation (malloc experts needed)

Charlie Root root at plewe.is.tsukuba.ac.jp
Thu May 20 01:32:05 PDT 2004


On Thu, May 20, 2004 at 01:42:00AM -0500, Dan Nelson wrote:
> In the last episode (May 20), Till Plewe said:
> > My problem is essentially that freeing large numbers of small chunks
> > of memory can be very slow. I have run into this problem twice so
> > far.
> 
> Do you have a testcase?  The attached program mallocs 1 million
> 128-byte blocks, then frees them.  With MALLOC_OPTIONS set to jz (i.e.
> no filling of freed memory), it takes .184 seconds to free them all. 
> With it set to J, it takes 1 second.
> 
> CPU: Intel Pentium III (909.96-MHz 686-class CPU)
>  

...

I get 

NUM		SIZE		MALLOC_OPTIONS		time
1058576		128		jz			0.044
1058576		128		JZ			0.13

128*1048576	8		jz			5.28
128*1048576	8		JZ			7.70

200*1048576	8		jz			8.25
200*1048576	8		JZ			13.17		

with CPU: AMD Opteron(tm) Processor 248 (2205.02-MHz K8-class CPU)

but with NUM 255*1048576 I run out of memory (although I have 6GB and
your test program should only use about
(sizeof(void*)+SIZE)*NUM=(8+8)*255*1048576=4GB)

Using NUM 256*1048576, SIZE 8 I get 

# gcc -o test test.c
/var/tmp//ccLxywz6.s: Assembler messages:
/var/tmp//ccLxywz6.s:95: Error: .COMMon length (-2147483648.) <0! Ignored.
/var/tmp//ccLxywz6.s:95: Warning: rest of line ignored; first ignored character is `,'

In any case since I have the pointers in a hash table (Judy array)
rather than an array I need extra time for look-up/deleting the entry
in the hash table as well. If I could get malloc to use a fixed memory
region for the part I want to delete (both for the hash table and the
information pointed to) deletion should take no time at all.

In my program I get times like this 

	DATA 6.553015 sec 
	JUDY 7.593997 sec
	deleted 1272062 hash entries, freed 28542840(Judy) + 15264744(data) bytes 
	
where judy translates hash values to pointers pointing to simple structs. 
Since I want to delete up to 10^8 entries the times get quite bad.
 
I guess quite a bit of the extra time is spent jumping around in
memory. Your test program frees memory in the order it was allocated which
should be a quite regular pattern. 

I will test some more and then post some more details.
Thanks for your answer.

- Till



More information about the freebsd-questions mailing list