gccが4.4の頃に見つけた方法なんです。
>通常、 malloc() は、ヒープからメモリを割り当て、必要に応じてヒープのサイズを sbrk(2) を使って調節する。
sbrkの呼び出しが多いとkernelの負荷が馬鹿にならないようです。
先に大量にmallocしておいて、開放しておけば、sbrkの呼び出しが減らせるのではと考えたわけです。
早くなってるかどうかはわからないが、sbrkの呼び出しは減ってるかな。
--- a/libiberty/xmalloc.c.1024 2005-05-25 06:01:33.000000000 +0900
+++ b/libiberty/xmalloc.c 2009-11-17 17:42:36.901024875 +0900
@@ -100,6 +100,30 @@ static const char *name = "";
/* The initial sbrk, set when the program name is set. Not used for win32
ports other than cygwin32. */
static char *first_break = NULL;
+static
+inline
+void
+check_first_break(void)
+{
+ if(first_break) return;
+ /* Win32 ports other than cygwin32 don't have brk() */
+ first_break = (char *) sbrk (0);
+#ifdef HAVE_MMAP
+ {
+#define M2048 (2048*8/64)
+ void *ptr[M2048];
+ int i;
+ for (i=0;i+ {
+ ptr[i] = malloc (64*1024);
+ }
+ for (i=M2048;i;i--)
+ {
+ free (ptr[i-1]);
+ }
+ }
+#endif
+}
#endif /* HAVE_SBRK */
void
@@ -107,9 +131,7 @@ xmalloc_set_program_name (const char *s)
{
name = s;
#ifdef HAVE_SBRK
- /* Win32 ports other than cygwin32 don't have brk() */
- if (first_break == NULL)
- first_break = (char *) sbrk (0);
+ check_first_break();
#endif /* HAVE_SBRK */
}
@@ -142,6 +164,10 @@ xmalloc (size_t size)
{
PTR newmem;
+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (size == 0)
size = 1;
newmem = malloc (size);
@@ -156,6 +182,10 @@ xcalloc (size_t nelem, size_t elsize)
{
PTR newmem;
+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (nelem == 0 || elsize == 0)
nelem = elsize = 1;
@@ -171,6 +201,10 @@ xrealloc (PTR oldmem, size_t size)
{
PTR newmem;
+#ifdef HAVE_SBRK
+ check_first_break();
+#endif /* HAVE_SBRK */
+
if (size == 0)
size = 1;
if (!oldmem)[0回]
PR