In my case, it seems to a combination of RHEL/CentOS and 64 bit Pentium 4 that is much slower

even compiling the program with -m32 on the 64-bit CentOS improves matters greatly

I'm comparing

32-bit  1.26 GHz Pentium III, Centos 5
64-bit  2.8 GHz Pentium 4, CentOS 4
64-bit  2.8 GHz Pentium 4, CentOS 5

32-bit 3.0 GHz Pentium 4, Fedora 8
64-bit 2.6 GHz Opteron, RHEL 4

1.
32-bit fedora 8>  time sorttest 20
real    2m46.315s   (164.315)
user    2m44.485s
sys     0m1.805s

2.
2.8 GHz Pentium 4, CentOS 5, glibc-2.5-18.el5_1.1.x86_64 (64bit)
/usr/bin/time --portability sorttest 20
real 490.02
user 488.89
sys 1.03

3.
2.8 GHz Pentium 4, CentOS 4, glibc-2.3.4-2.39.x86_64 (64bit)
/usr/bin/time --portability sorttest 20
real 494.07
user 492.67
sys 1.21

4.
1.26 GHz Pentium III, CentOS 5, glibc-2.5-18.el5_1.1.i686 (32bit)
/usr/bin/time --portability sorttest 20
real 259.24
user 257.40
sys 1.75

5.
2.6 GHz Opteron 285, RHEL 4, glibc-2.3.4-2.25.x86_64 (64-bit)
/usr/bin/time sorttest 20
real    2m6.252s    (126.25)
user    2m5.316s
sys     0m0.676s

and finally repeat 2. but compile with -m32
 2.8 GHz Pentium 4, CentOS 5, glibc-2.5-18.el5_1.1.i686 (32bit)
/usr/bin/time --portability sorttest 20
real 141.29
user 140.27
sys 0.93


The 1.2 GHz P3 is almost twice as fast as the the 2.8 GHz P4 for this case. and compiling the program -m32 on a 64 bit system also improves matters.

Moreover: I put clock statements into the program as below: most of the time difference occurs during the qsort() call, though I'm not clear if it's the qsort itself or the time spent in srt_f(). I suspect the latter.

/* compile:  cc sorttest.c -O3 -lm -o sorttest  */
/* Run: ./sorttest 20 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define N 10000000 /* vector of 10-M */

int scr[N], i, cnt, n, posx[N], srt_f(const void *, const void *);

double a, aaa, posy[N];

int srt_f(const void *a, const void *b)
{
  aaa = posy[*((int *)a)] - posy[*((int *)b)];
  if ( aaa < 0. ) return(-1);
  return( aaa > 0. );
}

int main(int argc, char *argv[])
{
  clock_t ts, te;
  cnt = ( argc == 1 ) ? 1 : atoi(argv[1]);
  for ( n = 0; n < cnt; ++n )
  {
    ts = clock();
    printf("%d:\n",n);
    for ( i = 0; i < N; ++i )
    {
      posx[i] = i;
      a += .001;
      posy[i] = sin(a);
    }
    te = clock();
printf(" generate: %4.4f\n",(double)(te-ts)/(double) CLOCKS_PER_SEC);
    ts = te;
    qsort((void *) posx, i, sizeof(i), srt_f);
    te = clock();
    printf(" sort: %4.4f\n",(double)(te-ts)/(double)CLOCKS_PER_SEC);
    ts = te;
    for ( i = 0; i < N; ++i )
      scr[posx[i]] = (1000*i)/N;
    te = clock();
    printf(" save: %4.4f\n",(double)(te-ts)/(double)CLOCKS_PER_SEC);
  }
}


Tony Schreiner




_______________________________________________
rhelv5-list mailing list
rhelv5-list@redhat.com
https://www.redhat.com/mailman/listinfo/rhelv5-list

Reply via email to