Skip to content

Commit ca4906b

Browse files
committed
Pass num of iters to benchmarks as variable, and define envvar
1 parent 02dd5f1 commit ca4906b

7 files changed

+150
-123
lines changed

src/bench.h

+12-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void print_number(const int64_t x) {
7373
printf("%s", &buffer[ptr]);
7474
}
7575

76-
void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) {
76+
void run_benchmark(char *name, void (*benchmark)(void*, int), void (*setup)(void*), void (*teardown)(void*, int), void* data, int count, int iter) {
7777
int i;
7878
int64_t min = INT64_MAX;
7979
int64_t sum = 0;
@@ -84,10 +84,10 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v
8484
setup(data);
8585
}
8686
begin = gettime_i64();
87-
benchmark(data);
87+
benchmark(data, iter);
8888
total = gettime_i64() - begin;
8989
if (teardown != NULL) {
90-
teardown(data);
90+
teardown(data, iter);
9191
}
9292
if (total < min) {
9393
min = total;
@@ -121,4 +121,13 @@ int have_flag(int argc, char** argv, char *flag) {
121121
return 0;
122122
}
123123

124+
int get_iters(int default_iters) {
125+
char* env = getenv("SECP256K1_BENCH_ITERS");
126+
if (env) {
127+
return strtol(env, NULL, 0);
128+
} else {
129+
return default_iters;
130+
}
131+
}
132+
124133
#endif /* SECP256K1_BENCH_H */

src/bench_ecdh.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,25 @@ static void bench_ecdh_setup(void* arg) {
3434
CHECK(secp256k1_ec_pubkey_parse(data->ctx, &data->point, point, sizeof(point)) == 1);
3535
}
3636

37-
static void bench_ecdh(void* arg) {
37+
static void bench_ecdh(void* arg, int iters) {
3838
int i;
3939
unsigned char res[32];
4040
bench_ecdh_data *data = (bench_ecdh_data*)arg;
4141

42-
for (i = 0; i < 20000; i++) {
42+
for (i = 0; i < iters; i++) {
4343
CHECK(secp256k1_ecdh(data->ctx, res, &data->point, data->scalar, NULL, NULL) == 1);
4444
}
4545
}
4646

4747
int main(void) {
4848
bench_ecdh_data data;
4949

50+
int iters = get_iters(20000);
51+
5052
/* create a context with no capabilities */
5153
data.ctx = secp256k1_context_create(SECP256K1_FLAGS_TYPE_CONTEXT);
5254

53-
run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, 20000);
55+
run_benchmark("ecdh", bench_ecdh, bench_ecdh_setup, NULL, &data, 10, iters);
5456

5557
secp256k1_context_destroy(data.ctx);
5658
return 0;

src/bench_ecmult.c

+24-17
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "secp256k1.c"
1919

2020
#define POINTS 32768
21-
#define ITERS 10000
2221

2322
typedef struct {
2423
/* Setup once in advance */
@@ -55,13 +54,13 @@ static int bench_callback(secp256k1_scalar* sc, secp256k1_ge* ge, size_t idx, vo
5554
return 1;
5655
}
5756

58-
static void bench_ecmult(void* arg) {
57+
static void bench_ecmult(void* arg, int iters) {
5958
bench_data* data = (bench_data*)arg;
6059

61-
size_t count = data->count;
6260
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;
6564

6665
for (iter = 0; iter < iters; ++iter) {
6766
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) {
7675
data->offset2 = (data->count * 0x7f6f537b + 0x6a1a8f49) % POINTS;
7776
}
7877

79-
static void bench_ecmult_teardown(void* arg) {
78+
static void bench_ecmult_teardown(void* arg, int iters) {
8079
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;
8382
/* Verify the results in teardown, to avoid doing comparisons while benchmarking. */
8483
for (iter = 0; iter < iters; ++iter) {
8584
secp256k1_gej tmp;
@@ -104,10 +103,10 @@ static void generate_scalar(uint32_t num, secp256k1_scalar* scalar) {
104103
CHECK(!overflow);
105104
}
106105

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) {
108107
char str[32];
109108
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;
111110
size_t iter;
112111

113112
data->count = count;
@@ -130,7 +129,7 @@ static void run_test(bench_data* data, size_t count, int includes_g) {
130129

131130
/* Run the benchmark. */
132131
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);
134133
}
135134

136135
int main(int argc, char **argv) {
@@ -139,6 +138,8 @@ int main(int argc, char **argv) {
139138
secp256k1_gej* pubkeys_gej;
140139
size_t scratch_size;
141140

141+
int iters = get_iters(10000);
142+
142143
data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
143144
scratch_size = secp256k1_strauss_scratch_size(POINTS) + STRAUSS_SCRATCH_OBJECTS*16;
144145
data.scratch = secp256k1_scratch_space_create(data.ctx, scratch_size);
@@ -167,8 +168,8 @@ int main(int argc, char **argv) {
167168
data.scalars = malloc(sizeof(secp256k1_scalar) * POINTS);
168169
data.seckeys = malloc(sizeof(secp256k1_scalar) * POINTS);
169170
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));
172173

173174
/* Generate a set of scalars, and private/public keypairs. */
174175
pubkeys_gej = malloc(sizeof(secp256k1_gej) * POINTS);
@@ -185,14 +186,20 @@ int main(int argc, char **argv) {
185186
free(pubkeys_gej);
186187

187188
for (i = 1; i <= 8; ++i) {
188-
run_test(&data, i, 1);
189+
run_test(&data, i, 1, iters);
189190
}
190191

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+
}
194200
}
195201
}
202+
196203
if (data.scratch != NULL) {
197204
secp256k1_scratch_space_destroy(data.ctx, data.scratch);
198205
}

0 commit comments

Comments
 (0)