Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 26 Aug 1998 03:06:44 -0400
From:      Harlan Stenn <Harlan.Stenn@pfcs.com>
To:        joelh@gnu.org
Cc:        garbanzo@hooked.net, mike@smith.net.au, entropy@compufit.at, wwoods@cybcon.com, freebsd-current@FreeBSD.ORG
Subject:   Re: gcc 2.8 
Message-ID:  <25448.904115204@brown.pfcs.com>
In-Reply-To: Joel Ray Holveck's (joelh@gnu.org) message dated Tue, 25 Aug 1998 17:54:26.  <199808252254.RAA01679@detlev.UUCP> 

next in thread | previous in thread | raw e-mail | index | archive | help
> > I tested two packages.
> > One compares a number (6-8) byte move subroutines (memcpy, bcopy, a variety
> > of Duff's devices (using char, short, and int), and some other "fast" byte
> > copies I've snarfed over the years).
> 
> Just to be sure: these are using their own recompiled bcopy etc, and
> not running the ones out of libc?

This benchmark uses whatever libc byte movers are detected (bcopy or 
memcpy), and 5 or 6 different "source" versions.

> > I run a reasonable quantity of different size/alignments against each of 
> > these, and report the CPU time of each one.
> 
> Could you please post this data?

It's kinda boring, but if everybody is interested I'll post it.  If only a 
couple of folks are interested, I'll send it directly.

Basically, I added the following code to the byte-mover subroutine:

#ifdef BMOVESTATS
#define BMS_MAXSIZE 2049
int bms[BMS_MAXSIZE + 1][4][4];
#endif /* BMOVESTATS */

(I picked 2049 because this application hardly ever moves bigger chunks of 
memory.)

... and inside the byte mover subroutine:

#ifdef BMOVESTATS
        if((n = len) > BMS_MAXSIZE) {
                n = BMS_MAXSIZE;}
        ++bms[n][((int)src) & 3][((int)dst) & 3];
#endif /* BMOVESTATS */

... and I call this subroutine before the executable exits:

void bmovestats(void)
{
#ifdef BMOVESTATS
        int i;
        int d;
        int s;
        FILE *fp;
#define BMOVE_STATFILE  "bmovestats"

        if((fp = fopen(BMOVE_STATFILE, "w")) == NULL) {
                fp = stderr;}

        for(i = 0; i <= BMS_MAXSIZE; ++i)
            for (s = 0; s < 4; s++)
                for (d = 0; d < 4; d++)
                    if(bms[i][s][d])
                        fprintf(fp, "%d\t%d\t%d\t%d\n", i, s, d, bms[i][s][d]);

        if(fp != stderr) {
                fclose(fp);}
#endif /* BMOVESTATS */
        return;}

Then I ran several applications under various production conditions,
collected various "bmovestats" files, and then ran a little program that,
for each byte mover, basically ran the following loop (in this case, for 
bcopy):

#ifdef HAVE_BCOPY
        rewind(ifp);
        (void)times(&t_b);
        t_u = t_b.tms_utime;

        while((rc = fscanf(ifp, "%d%d%d%d", &len, &sa, &da, &qty)) != EOF) {
                sp = src + sa;
                dp = dst + da;
                for(i = 0; i < qty; i++) {
                        bcopy(sp, dp, len);}}

        (void)times(&t_b);
        printf("%8.0d", t_b.tms_utime - t_u - ovhd);
        fflush(stdout);
#endif /* HAVE_BCOPY */

the "ovhd" value is the time to run the loop with *no* byte copy being 
performed; I suspect a Really Good Compiler would pretty much invalidate 
this benchmark. "ifp" points to the current "bmovestats" file.

H



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



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