bench.c raw
1 #include <stdio.h>
2 #include <math.h>
3 #include "sys/time.h"
4
5 #include "ctaes.h"
6
7 static double gettimedouble(void) {
8 struct timeval tv;
9 gettimeofday(&tv, NULL);
10 return tv.tv_usec * 0.000001 + tv.tv_sec;
11 }
12
13 static void print_number(double x) {
14 double y = x;
15 int c = 0;
16 if (y < 0.0) {
17 y = -y;
18 }
19 while (y < 100.0) {
20 y *= 10.0;
21 c++;
22 }
23 printf("%.*f", c, x);
24 }
25
26 static void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) {
27 int i;
28 double min = HUGE_VAL;
29 double sum = 0.0;
30 double max = 0.0;
31 for (i = 0; i < count; i++) {
32 double begin, total;
33 if (setup != NULL) {
34 setup(data);
35 }
36 begin = gettimedouble();
37 benchmark(data);
38 total = gettimedouble() - begin;
39 if (teardown != NULL) {
40 teardown(data);
41 }
42 if (total < min) {
43 min = total;
44 }
45 if (total > max) {
46 max = total;
47 }
48 sum += total;
49 }
50 printf("%s: min ", name);
51 print_number(min * 1000000000.0 / iter);
52 printf("ns / avg ");
53 print_number((sum / count) * 1000000000.0 / iter);
54 printf("ns / max ");
55 print_number(max * 1000000000.0 / iter);
56 printf("ns\n");
57 }
58
59 static void bench_AES128_init(void* data) {
60 AES128_ctx* ctx = (AES128_ctx*)data;
61 int i;
62 for (i = 0; i < 50000; i++) {
63 AES128_init(ctx, (unsigned char*)ctx);
64 }
65 }
66
67 static void bench_AES128_encrypt_setup(void* data) {
68 AES128_ctx* ctx = (AES128_ctx*)data;
69 static const unsigned char key[16] = {0};
70 AES128_init(ctx, key);
71 }
72
73 static void bench_AES128_encrypt(void* data) {
74 const AES128_ctx* ctx = (const AES128_ctx*)data;
75 unsigned char scratch[16] = {0};
76 int i;
77 for (i = 0; i < 4000000 / 16; i++) {
78 AES128_encrypt(ctx, 1, scratch, scratch);
79 }
80 }
81
82 static void bench_AES128_decrypt(void* data) {
83 const AES128_ctx* ctx = (const AES128_ctx*)data;
84 unsigned char scratch[16] = {0};
85 int i;
86 for (i = 0; i < 4000000 / 16; i++) {
87 AES128_decrypt(ctx, 1, scratch, scratch);
88 }
89 }
90
91 static void bench_AES192_init(void* data) {
92 AES192_ctx* ctx = (AES192_ctx*)data;
93 int i;
94 for (i = 0; i < 50000; i++) {
95 AES192_init(ctx, (unsigned char*)ctx);
96 }
97 }
98
99 static void bench_AES192_encrypt_setup(void* data) {
100 AES192_ctx* ctx = (AES192_ctx*)data;
101 static const unsigned char key[16] = {0};
102 AES192_init(ctx, key);
103 }
104
105 static void bench_AES192_encrypt(void* data) {
106 const AES192_ctx* ctx = (const AES192_ctx*)data;
107 unsigned char scratch[16] = {0};
108 int i;
109 for (i = 0; i < 4000000 / 16; i++) {
110 AES192_encrypt(ctx, 1, scratch, scratch);
111 }
112 }
113
114 static void bench_AES192_decrypt(void* data) {
115 const AES192_ctx* ctx = (const AES192_ctx*)data;
116 unsigned char scratch[16] = {0};
117 int i;
118 for (i = 0; i < 4000000 / 16; i++) {
119 AES192_decrypt(ctx, 1, scratch, scratch);
120 }
121 }
122
123 static void bench_AES256_init(void* data) {
124 AES256_ctx* ctx = (AES256_ctx*)data;
125 int i;
126 for (i = 0; i < 50000; i++) {
127 AES256_init(ctx, (unsigned char*)ctx);
128 }
129 }
130
131
132 static void bench_AES256_encrypt_setup(void* data) {
133 AES256_ctx* ctx = (AES256_ctx*)data;
134 static const unsigned char key[16] = {0};
135 AES256_init(ctx, key);
136 }
137
138 static void bench_AES256_encrypt(void* data) {
139 const AES256_ctx* ctx = (const AES256_ctx*)data;
140 unsigned char scratch[16] = {0};
141 int i;
142 for (i = 0; i < 4000000 / 16; i++) {
143 AES256_encrypt(ctx, 1, scratch, scratch);
144 }
145 }
146
147 static void bench_AES256_decrypt(void* data) {
148 const AES256_ctx* ctx = (const AES256_ctx*)data;
149 unsigned char scratch[16] = {0};
150 int i;
151 for (i = 0; i < 4000000 / 16; i++) {
152 AES256_decrypt(ctx, 1, scratch, scratch);
153 }
154 }
155
156 int main(void) {
157 AES128_ctx ctx128;
158 AES192_ctx ctx192;
159 AES256_ctx ctx256;
160 run_benchmark("aes128_init", bench_AES128_init, NULL, NULL, &ctx128, 20, 50000);
161 run_benchmark("aes128_encrypt_byte", bench_AES128_encrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
162 run_benchmark("aes128_decrypt_byte", bench_AES128_decrypt, bench_AES128_encrypt_setup, NULL, &ctx128, 20, 4000000);
163 run_benchmark("aes192_init", bench_AES192_init, NULL, NULL, &ctx192, 20, 50000);
164 run_benchmark("aes192_encrypt_byte", bench_AES192_encrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
165 run_benchmark("aes192_decrypt_byte", bench_AES192_decrypt, bench_AES192_encrypt_setup, NULL, &ctx192, 20, 4000000);
166 run_benchmark("aes256_init", bench_AES256_init, NULL, NULL, &ctx256, 20, 50000);
167 run_benchmark("aes256_encrypt_byte", bench_AES256_encrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
168 run_benchmark("aes256_decrypt_byte", bench_AES256_decrypt, bench_AES256_encrypt_setup, NULL, &ctx256, 20, 4000000);
169 return 0;
170 }
171