]>
git.saurik.com Git - apple/security.git/blob - libsecurity_cryptkit/ckutils/giantAsmBench/giantAsmBench.c
1 /* Copyright (c) 1998 Apple Computer, Inc. All rights reserved.
3 * giantAsmBench.c - Benchmark of platform-specific giantInteger primitives.
7 * 18 Apr 98 Doug Mitchell at Apple
11 #include <security_cryptkit/giantPortCommon.h>
12 #include <security_cryptkit/feeDebug.h>
13 #include <security_cryptkit/feeFunctions.h>
15 #include "ckutilsPlatform.h"
19 #define LOOPS_DEF 10000
20 #define MIN_SIZE_DEF 1 /* mix digits for vectorMultiply test */
21 #define MAX_SIZE_DEF 8 /* max digits */
24 static void usage(char **argv
)
26 printf("usage: %s [options]\n", argv
[0]);
27 printf(" Options:\n");
28 printf(" l=loops (default = %d)\n", LOOPS_DEF
);
29 printf(" n=maxDigits (default = %d)\n", MIN_SIZE_DEF
);
30 printf(" x=maxDigits (default = %d)\n", MAX_SIZE_DEF
);
37 * Fill buffer with random data. Assumes giantDigits is native int size.
39 static void randDigits(unsigned numDigits
,
44 for(i
=0; i
<numDigits
; i
++) {
45 /* RAND() only returns 31 bits on Unix.... */
46 digits
[i
]= RAND() + ((RAND() & 1) << 31);
52 int main(int argc
, char **argv
)
56 giantDigit
*digit1
; // mallocd arrays
60 giantDigit
*dig1p
; // ptr into mallocd arrays
69 giantDigit scr1
; // op result
70 giantDigit scr2
; // op result
71 int loops
= LOOPS_DEF
;
74 unsigned maxSize
= MAX_SIZE_DEF
;
75 unsigned minSize
= MIN_SIZE_DEF
;
80 argc
= ccommand(&argv
);
83 for(arg
=1; arg
<argc
; arg
++) {
87 maxSize
= atoi(&argp
[2]);
90 minSize
= atoi(&argp
[2]);
93 loops
= atoi(&argp
[2]);
96 seed
= atoi(&argp
[2]);
108 seed
= (unsigned)tim
;
113 * Scratch digits, big enough for anything. Malloc here, init with
114 * random data before each test.
116 digit1
= malloc(sizeof(giantDigit
) * loops
* 2);
117 digit2
= malloc(sizeof(giantDigit
) * loops
* 2);
119 /* vect1 and vect2 are arrays of giantDigit arrays */
120 vect1
= malloc(sizeof(giantDigit
) * loops
* maxSize
);
121 vect2
= malloc(sizeof(giantDigit
) * loops
* maxSize
);
123 if((digit1
== NULL
) || (digit1
== NULL
) ||
124 (vect1
== NULL
) || (vect2
== NULL
)) {
125 printf("malloc error\n");
129 printf("Starting giantAsm test: seed %d\n", seed
);
131 /* giantAddDigits test */
132 randDigits(loops
, digit1
);
133 randDigits(loops
, digit2
);
136 PLAT_GET_TIME(startTime
);
137 for(i
=0; i
<loops
; i
++) {
138 scr1
= giantAddDigits(*dig1p
++, *dig2p
++, &scr2
);
140 PLAT_GET_TIME(endTime
);
141 elapsed
= PLAT_GET_NS(startTime
, endTime
);
142 printf("giantAddDigits: %f ns\n",
143 (double)elapsed
/ (double)loops
);
145 /* giantAddDouble test */
146 randDigits(loops
, digit1
);
147 randDigits(loops
* 2, digit2
);
150 PLAT_GET_TIME(startTime
);
151 for(i
=0; i
<loops
; i
++) {
152 giantAddDouble(dig2p
, dig2p
+1, *dig1p
++);
155 PLAT_GET_TIME(endTime
);
156 elapsed
= PLAT_GET_NS(startTime
, endTime
);
157 printf("giantAddDouble: %f ns\n",
158 (double)elapsed
/ (double)loops
);
160 /* giantSubDigits test */
161 randDigits(loops
, digit1
);
162 randDigits(loops
, digit2
);
165 PLAT_GET_TIME(startTime
);
166 for(i
=0; i
<loops
; i
++) {
167 scr1
= giantSubDigits(*dig1p
++, *dig2p
++, &scr2
);
169 PLAT_GET_TIME(endTime
);
170 elapsed
= PLAT_GET_NS(startTime
, endTime
);
171 printf("giantSubDigits: %f ns\n",
172 (double)elapsed
/ (double)loops
);
174 /* giantMulDigits test */
175 randDigits(loops
, digit1
);
176 randDigits(loops
, digit2
);
179 PLAT_GET_TIME(startTime
);
180 for(i
=0; i
<loops
; i
++) {
181 giantMulDigits(*dig1p
++, *dig2p
++, &scr1
, &scr2
);
183 PLAT_GET_TIME(endTime
);
184 elapsed
= PLAT_GET_NS(startTime
, endTime
);
185 printf("giantMulDigits: %f ns\n",
186 (double)elapsed
/ (double)loops
);
188 printf("\nvectorMultiply:\n");
189 for(numDigits
=minSize
; numDigits
<=maxSize
; numDigits
*=2) {
191 randDigits(loops
, digit1
); // plierDigit
192 randDigits(loops
* numDigits
, vect1
); // candVector
193 randDigits(loops
* numDigits
, vect2
); // prodVector
198 PLAT_GET_TIME(startTime
);
199 for(i
=0; i
<loops
; i
++) {
200 scr1
= VectorMultiply(*dig1p
++, // plierDigit
201 vect1p
, // candVector
203 vect2p
); // prodVector
207 PLAT_GET_TIME(endTime
);
208 elapsed
= PLAT_GET_NS(startTime
, endTime
);
209 printf(" bits = %4d : %f ns\n",
210 numDigits
* GIANT_BITS_PER_DIGIT
,
211 (double)elapsed
/ (double)loops
);
213 } /* for numDigits */