[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apr-dev
Subject:    Re: [PATCH] vformatter cleanups (related to PR 42250)
From:       Jim Jagielski <jim () jaguNET ! com>
Date:       2007-04-28 14:26:00
Message-ID: 5794CE79-E5D3-4308-9DD2-7AEF9F30E60D () jaguNET ! com
[Download RAW message or body]


On Apr 26, 2007, at 11:14 PM, Lucian Adrian Grijincu wrote:

> in apr-conv10-faster.patch you added:
>
> static const char digits[] = "0123456789";
> *--p = digits[magnitude % 10];
>
> Why is this faster than:
> *--p = (char) '0' + (magnitude % 10); ?
>
> For your "faster" version, under the hood, the C compiler adds
> (magnitude % 10) to the address of digits and then copies the contents
> of the memory location represented by the sum's result into *--p.
>
> My version just adds (magnitude % 10) to '0' and stores the result  
> in *--p.
>

Basically, the "faster" version would not be, assuming the cast
isn't that expensive...

This was run on an old FreeBSD box, and, ymmv, the ratios have proven
to be pretty constant on other systems and implementations (for
those of us old-timers, the biggest "surprise" may be that floating
point is no longer costly):

% ./cputimes
   Operation                         Clicks for each trial    Mics/N
Null Loop (n=10000000)
   {}                                  7       8       6        
8       9       0.01
Int Operations (n=10000000)
   i1++                                7       8       8        
8       7       0.00
   i1 = i2 + i3                        8       8       8        
8       9       0.00
   i1 = i2 - i3                        9      10      10        
9       8       0.00
   i1 = i2 * i3                        8      10       9        
8       9       0.00
   i1 = i2 / i3                       46      46      47      46       
46       0.03
   i1 = i2 % i3                       47      46      46      47       
46       0.03
Float Operations (n=10000000)
   f1 = f2                             8       7       8        
8       8       0.00
   f1 = f2 + f3                        8       8       9        
7       9       0.00
   f1 = f2 - f3                        9       8       8        
9       8       0.00
   f1 = f2 * f3                        8       7       8        
8       8       0.00
   f1 = f2 / f3                       40      41      40      40       
40       0.03
Numeric Conversions (n=10000000)
   i1 = f1                            69      70      69      70       
69       0.05
   f1 = i1                            11      11      11      11       
11       0.00
Integer Vector Operations (n=10000000)
   v[i] = i                           21      21      23      21       
22       0.01
   v[v[i]] = i                        46      47      47      47       
47       0.03
   v[v[v[i]]] = i                     48      47      48      47       
47       0.03
Control Structures (n=10000000)
   if (i == 5) i1++                   10      11       8       9       
10       0.00
   if (i != 5) i1++                   10       9       8       9       
10       0.00
   while (i < 0) i1++                  9       9       8       8       
11       0.00
   i1 = sum1(i2)                      17      18      17      18       
18       0.01
   i1 = sum2(i2, i3)                  19      20      19      20       
19       0.01
   i1 = sum3(i2, i3, i4)              24      23      24      23       
24       0.01
Input/Output (n=1000000)
   fputs(s, fp)                       34      34      34      34       
35       0.26
   fgets(s, 9, fp)                    27      27      27      27       
27       0.20
   fprintf(fp, sdn, i)               110     108     109     109      
109       0.85
   fscanf(fp, sd, &i1)               159     158     159     163      
158       1.24
Malloc (n=1000000)
   free(malloc(8))                    75      74      75      75       
74       0.58
   push(i)                            51      51      53      54       
53       0.40
   i1 = pop()                         27      28      28      28       
28       0.21
String Functions (n=10000000)
   strcpy(s, s0123456789)             52      52      53      52       
53       0.04
   i1 = strcmp(s, s)                   7       9       6        
9       9       0.00
   i1 = strcmp(s, sa123456789)        26      25      23      23       
24       0.01
String/Number Conversions (n=100000)
   i1 = atoi(s12345)                   4       3       4        
4       3       0.28
   sscanf(s12345, sd, &i1)            20      19      19      20       
19       1.51
   sprintf(s, sd, i)                   9       9      10        
9       9       0.71
   f1 = atof(s123_45)                  3       3       3        
3       3       0.23
   sscanf(s123_45, sf, &f1)           20      19      19      20       
19       1.51
   sprintf(s, sf62, 123.45)           29      29      30      30       
29       2.29
Math Functions (n=1000000)
   i1 = rand()                         9       9       9       
10       9       0.07
   f1 = log(f2)                       18      17      18      18       
17       0.13
   f1 = exp(f2)                       30      29      29      30       
29       0.22
   f1 = sin(f2)                       18      17      18      17       
18       0.13
   f1 = sqrt(f2)                      12      11      12      12       
11       0.08
Total Seconds:     48.34


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic