bench.c
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 }