18
18
#include "secp256k1.c"
19
19
20
20
#define POINTS 32768
21
- #define ITERS 10000
22
21
23
22
typedef struct {
24
23
/* Setup once in advance */
@@ -55,13 +54,13 @@ static int bench_callback(secp256k1_scalar* sc, secp256k1_ge* ge, size_t idx, vo
55
54
return 1 ;
56
55
}
57
56
58
- static void bench_ecmult (void * arg ) {
57
+ static void bench_ecmult (void * arg , int iters ) {
59
58
bench_data * data = (bench_data * )arg ;
60
59
61
- size_t count = data -> count ;
62
60
int includes_g = data -> includes_g ;
63
- size_t iters = 1 + ITERS / count ;
64
- size_t iter ;
61
+ int iter ;
62
+ int count = data -> count ;
63
+ iters = iters / data -> count ;
65
64
66
65
for (iter = 0 ; iter < iters ; ++ iter ) {
67
66
data -> ecmult_multi (& data -> ctx -> error_callback , & data -> ctx -> ecmult_ctx , data -> scratch , & data -> output [iter ], data -> includes_g ? & data -> scalars [data -> offset1 ] : NULL , bench_callback , arg , count - includes_g );
@@ -76,10 +75,10 @@ static void bench_ecmult_setup(void* arg) {
76
75
data -> offset2 = (data -> count * 0x7f6f537b + 0x6a1a8f49 ) % POINTS ;
77
76
}
78
77
79
- static void bench_ecmult_teardown (void * arg ) {
78
+ static void bench_ecmult_teardown (void * arg , int iters ) {
80
79
bench_data * data = (bench_data * )arg ;
81
- size_t iters = 1 + ITERS / data -> count ;
82
- size_t iter ;
80
+ int iter ;
81
+ iters = iters / data -> count ;
83
82
/* Verify the results in teardown, to avoid doing comparisons while benchmarking. */
84
83
for (iter = 0 ; iter < iters ; ++ iter ) {
85
84
secp256k1_gej tmp ;
@@ -104,10 +103,10 @@ static void generate_scalar(uint32_t num, secp256k1_scalar* scalar) {
104
103
CHECK (!overflow );
105
104
}
106
105
107
- static void run_test (bench_data * data , size_t count , int includes_g ) {
106
+ static void run_test (bench_data * data , size_t count , int includes_g , int num_iters ) {
108
107
char str [32 ];
109
108
static const secp256k1_scalar zero = SECP256K1_SCALAR_CONST (0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
110
- size_t iters = 1 + ITERS / count ;
109
+ size_t iters = 1 + num_iters / count ;
111
110
size_t iter ;
112
111
113
112
data -> count = count ;
@@ -130,7 +129,7 @@ static void run_test(bench_data* data, size_t count, int includes_g) {
130
129
131
130
/* Run the benchmark. */
132
131
sprintf (str , includes_g ? "ecmult_%ig" : "ecmult_%i" , (int )count );
133
- run_benchmark (str , bench_ecmult , bench_ecmult_setup , bench_ecmult_teardown , data , 10 , count * ( 1 + ITERS / count ) );
132
+ run_benchmark (str , bench_ecmult , bench_ecmult_setup , bench_ecmult_teardown , data , 10 , count * iters );
134
133
}
135
134
136
135
int main (int argc , char * * argv ) {
@@ -139,6 +138,8 @@ int main(int argc, char **argv) {
139
138
secp256k1_gej * pubkeys_gej ;
140
139
size_t scratch_size ;
141
140
141
+ int iters = get_iters (10000 );
142
+
142
143
data .ctx = secp256k1_context_create (SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY );
143
144
scratch_size = secp256k1_strauss_scratch_size (POINTS ) + STRAUSS_SCRATCH_OBJECTS * 16 ;
144
145
data .scratch = secp256k1_scratch_space_create (data .ctx , scratch_size );
@@ -167,8 +168,8 @@ int main(int argc, char **argv) {
167
168
data .scalars = malloc (sizeof (secp256k1_scalar ) * POINTS );
168
169
data .seckeys = malloc (sizeof (secp256k1_scalar ) * POINTS );
169
170
data .pubkeys = malloc (sizeof (secp256k1_ge ) * POINTS );
170
- data .expected_output = malloc (sizeof (secp256k1_gej ) * (ITERS + 1 ));
171
- data .output = malloc (sizeof (secp256k1_gej ) * (ITERS + 1 ));
171
+ data .expected_output = malloc (sizeof (secp256k1_gej ) * (iters + 1 ));
172
+ data .output = malloc (sizeof (secp256k1_gej ) * (iters + 1 ));
172
173
173
174
/* Generate a set of scalars, and private/public keypairs. */
174
175
pubkeys_gej = malloc (sizeof (secp256k1_gej ) * POINTS );
@@ -185,14 +186,20 @@ int main(int argc, char **argv) {
185
186
free (pubkeys_gej );
186
187
187
188
for (i = 1 ; i <= 8 ; ++ i ) {
188
- run_test (& data , i , 1 );
189
+ run_test (& data , i , 1 , iters );
189
190
}
190
191
191
- for (p = 0 ; p <= 11 ; ++ p ) {
192
- for (i = 9 ; i <= 16 ; ++ i ) {
193
- run_test (& data , i << p , 1 );
192
+ /* This is disabled with low count of iterations because the loop runs 77 times even with iters=1
193
+ * and the higher it goes the longer the computation takes(more points)
194
+ * So we don't run this benchmark with low iterations to prevent slow down */
195
+ if (iters > 2 ) {
196
+ for (p = 0 ; p <= 11 ; ++ p ) {
197
+ for (i = 9 ; i <= 16 ; ++ i ) {
198
+ run_test (& data , i << p , 1 , iters );
199
+ }
194
200
}
195
201
}
202
+
196
203
if (data .scratch != NULL ) {
197
204
secp256k1_scratch_space_destroy (data .ctx , data .scratch );
198
205
}
0 commit comments