Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 Feb 2005 16:04:27 +0200
From:      Andriy Tkachuk <andrit@ukr.net>
To:        freebsd-hackers@freebsd.org
Cc:        freebsd-threads@freebsd.org
Subject:   Re: pthreads & dynamic memory in fbsd vs. the same in linux
Message-ID:  <200502101604.27196.andrit@ukr.net>
In-Reply-To: <346a8022050210054670390298@mail.gmail.com>
References:  <200502101055.04949.ant@emict.com> <346a8022050210054670390298@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
i sent the mail with attachement. anyway, the code:
(probably the better list would be -threads. sorry folks for flame.
i subscribed today to -threads, so please reply to it if no mind.)

> cat test2.cc
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <string>

using std::string;

#define COUNT_THREADS   500

pthread_t   thread[COUNT_THREADS];

char mode;
int iters;

void f()
{
  struct timeval t1,t2;
  void* p[iters];
  string s;

  sleep(2);

  while (1)
  {

    gettimeofday(&t1, NULL);

    if (mode == 's') {
            s = "";
            for (int i=0; i<iters; i++)
                    s += 'a';
    }
    if (mode == 'S') {
            string s;
            for (int i=0; i<iters; i++)
                    s = 'a';
    }

    if (mode == 'f')
            for (int i=0; i<iters; i++)
                    gettimeofday(&t2, NULL);

    if (mode == 'm') {
            for (int i=0; i<iters; i++)
                    p[i] = malloc(10);
            for (int i=0; i<iters; i++)
                    free(p[i]);
    }
    if (mode == 'n') {
            for (int i=0; i<iters; i++)
                    p[i] =  (char*) new char(10);
            for (int i=0; i<iters; i++)
                    delete (char*) p[i];
    }

    gettimeofday(&t2, NULL);

    int usec_d = t2.tv_usec-t1.tv_usec;
    int sec_d = t2.tv_sec-t1.tv_sec;
    if (usec_d<0) {
        sec_d--;
        usec_d += 1000000;
    }

    printf( "%u.%06u \n",  sec_d, usec_d);
  }
}


int main(int argc, char *argv[])
{

   mode = argv[1][0];
   iters = atoi(argv[2]);

  for (int i=0; i<COUNT_THREADS; i++) {
     pthread_create ( &(thread[i]), NULL, (void*(*)(void*))f, NULL );
     printf("thread %i created\n", i);
  }
  while(1) { sleep(1); }
}
>                                    

On Thursday 10 February 2005 15:46, Coleman Kane wrote:
> Could you post the code too, perchance?
>
> On Thu, 10 Feb 2005 10:55:04 +0200, Andriy Tkachuk <ant@emict.com> wrote:
> > Hi folks.
> >
> > I noticed the strange stick of pthreads (amount ~ 500)
> > when allocating dynamic memory by malloc or new
> >
> > in my system:
> > > uname -a
> >
> > FreeBSD ant.emict.com 5.3-STABLE FreeBSD 5.3-STABLE #0: Wed Feb  9
> > 17:30:11 EET 2005     ant@ant:/lin/fbsd_obj/usr/src/sys/ANT  i386
> >
> > It's interesting that the same program behaves differently
> > when it is compiled in linux and run on my fbsd machine in
> > linux_base-7.1_7 .
> >
> > > ldd test2-linux
> >
> > test2-linux:
> >         libpthread.so.0 => /lib/libpthread.so.0 (0x28065000)
> >         libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3
> > (0x2807c000) libm.so.6 => /lib/libm.so.6 (0x280bf000)
> >         libc.so.6 => /lib/libc.so.6 (0x280e1000)
> >         /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2804c000)
> >
> > > ldd a.out
> >
> > a.out:
> >         libpthread.so.1 => /usr/lib/libpthread.so.1 (0x28075000)
> >         libstdc++.so.4 => /usr/lib/libstdc++.so.4 (0x28099000)
> >         libm.so.3 => /lib/libm.so.3 (0x2816b000)
> >         libc.so.5 => /lib/libc.so.5 (0x28184000)
> >
> > Each thread allocates the amount of memory by 10 bytes in loop.
> > The number of iterations is specified in cmdline arg. The program
> > prints the time each thread is spent allocating memory in loop.
> > Let's look on results.
> >
> > > ./a.out n 1000  # 1000 iterations of new operator. Every new allocates
> > > 10bytes.
> >
> > thread 0 created
> > thread 1 created
> > thread 2 created
> > thread 3 created
> > thread 4 created
> > ...
> > thread 497 created
> > thread 498 created
> > thread 499 created
> > 0.001114
> > 0.001022
> > 0.001021
> > 0.001011
> > 0.001014
> > 0.001010
> > 0.001013
> > 0.001050
> > 0.001035
> > 0.001011
> > 0.001013
> > 0.001010
> > 0.001013
> > 0.001010
> > 0.001029
> > 0.001075
> > 0.001053
> > 0.001011
> > 0.001014
> > 0.001011
> > 0.001030
> > 0.001010
> > 0.001015
> > 0.001042
> > 0.001019
> > 0.001011
> > 0.001014
> > 0.001012
> > 0.001013
> > 0.001010
> > 0.001014
> > 0.361604
> > 3.225090
> > 3.225458
> > 3.225696
> > 3.225925
> > 3.226152
> > 3.226380
> > 3.226608
> > 3.226833
> > 3.227062
> > 3.227290
> > 3.227517
> > 3.227744
> > 3.227972
> > 3.228202
> > 3.228451
> > 3.228681
> > 3.228912
> > 3.229140
> > 3.229367
> >
> > The same, but in linux_base-7.1_7 :
> > > ./test2-linux n 1000
> >
> > thread 0 created
> > thread 1 created
> > ...
> > thread 498 created
> > thread 499 created
> > 0.000467
> > 0.000403
> > 0.000402
> > ...
> > 0.000391
> > 0.000391
> > 0.000395
> > ...
> > 0.000395
> > 0.010564
> > 0.000398
> > 0.000394
> >
> > The program source is attached.
> >
> > In linux program is compiled by
> > $ gcc -v
> > Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
> > gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)
> >
> > in fbsd:
> > > gcc -v
> >
> > Using built-in specs.
> > Configured with: FreeBSD/i386 system compiler
> > Thread model: posix
> > gcc version 3.4.2 [FreeBSD] 20040728
> >
> >
> > _______________________________________________
> > freebsd-hackers@freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> > To unsubscribe, send any mail to
> > "freebsd-hackers-unsubscribe@freebsd.org"
>
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200502101604.27196.andrit>