Daiki Kato / mbed-os-lychee

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f782d9c66c49 1 /*
dkato 0:f782d9c66c49 2 * Profiling framework for the events library
dkato 0:f782d9c66c49 3 *
dkato 0:f782d9c66c49 4 * Copyright (c) 2016 Christopher Haster
dkato 0:f782d9c66c49 5 *
dkato 0:f782d9c66c49 6 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:f782d9c66c49 7 * you may not use this file except in compliance with the License.
dkato 0:f782d9c66c49 8 * You may obtain a copy of the License at
dkato 0:f782d9c66c49 9 *
dkato 0:f782d9c66c49 10 * http://www.apache.org/licenses/LICENSE-2.0
dkato 0:f782d9c66c49 11 *
dkato 0:f782d9c66c49 12 * Unless required by applicable law or agreed to in writing, software
dkato 0:f782d9c66c49 13 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:f782d9c66c49 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:f782d9c66c49 15 * See the License for the specific language governing permissions and
dkato 0:f782d9c66c49 16 * limitations under the License.
dkato 0:f782d9c66c49 17 */
dkato 0:f782d9c66c49 18 #include "equeue.h"
dkato 0:f782d9c66c49 19 #include <unistd.h>
dkato 0:f782d9c66c49 20 #include <stdio.h>
dkato 0:f782d9c66c49 21 #include <setjmp.h>
dkato 0:f782d9c66c49 22 #include <stdint.h>
dkato 0:f782d9c66c49 23 #include <stdlib.h>
dkato 0:f782d9c66c49 24 #include <inttypes.h>
dkato 0:f782d9c66c49 25 #include <sys/time.h>
dkato 0:f782d9c66c49 26
dkato 0:f782d9c66c49 27
dkato 0:f782d9c66c49 28 // Performance measurement utils
dkato 0:f782d9c66c49 29 #define PROF_RUNS 5
dkato 0:f782d9c66c49 30 #define PROF_INTERVAL 100000000
dkato 0:f782d9c66c49 31
dkato 0:f782d9c66c49 32 #define prof_volatile(t) __attribute__((unused)) volatile t
dkato 0:f782d9c66c49 33
dkato 0:f782d9c66c49 34 typedef uint64_t prof_cycle_t;
dkato 0:f782d9c66c49 35
dkato 0:f782d9c66c49 36 static volatile prof_cycle_t prof_start_cycle;
dkato 0:f782d9c66c49 37 static volatile prof_cycle_t prof_stop_cycle;
dkato 0:f782d9c66c49 38 static prof_cycle_t prof_accum_cycle;
dkato 0:f782d9c66c49 39 static prof_cycle_t prof_baseline_cycle;
dkato 0:f782d9c66c49 40 static prof_cycle_t prof_iterations;
dkato 0:f782d9c66c49 41 static const char *prof_units;
dkato 0:f782d9c66c49 42
dkato 0:f782d9c66c49 43 #define prof_cycle() ({ \
dkato 0:f782d9c66c49 44 uint32_t a, b; \
dkato 0:f782d9c66c49 45 __asm__ volatile ("rdtsc" : "=a" (a), "=d" (b)); \
dkato 0:f782d9c66c49 46 ((uint64_t)b << 32) | (uint64_t)a; \
dkato 0:f782d9c66c49 47 })
dkato 0:f782d9c66c49 48
dkato 0:f782d9c66c49 49 #define prof_loop() \
dkato 0:f782d9c66c49 50 for (prof_iterations = 0; \
dkato 0:f782d9c66c49 51 prof_accum_cycle < PROF_INTERVAL; \
dkato 0:f782d9c66c49 52 prof_iterations++)
dkato 0:f782d9c66c49 53
dkato 0:f782d9c66c49 54 #define prof_start() ({ \
dkato 0:f782d9c66c49 55 prof_start_cycle = prof_cycle(); \
dkato 0:f782d9c66c49 56 })
dkato 0:f782d9c66c49 57
dkato 0:f782d9c66c49 58 #define prof_stop() ({ \
dkato 0:f782d9c66c49 59 prof_stop_cycle = prof_cycle(); \
dkato 0:f782d9c66c49 60 prof_accum_cycle += prof_stop_cycle - prof_start_cycle; \
dkato 0:f782d9c66c49 61 })
dkato 0:f782d9c66c49 62
dkato 0:f782d9c66c49 63 #define prof_result(value, units) ({ \
dkato 0:f782d9c66c49 64 prof_accum_cycle = value+prof_baseline_cycle; \
dkato 0:f782d9c66c49 65 prof_iterations = 1; \
dkato 0:f782d9c66c49 66 prof_units = units; \
dkato 0:f782d9c66c49 67 })
dkato 0:f782d9c66c49 68
dkato 0:f782d9c66c49 69 #define prof_measure(func, ...) ({ \
dkato 0:f782d9c66c49 70 printf("%s: ...", #func); \
dkato 0:f782d9c66c49 71 fflush(stdout); \
dkato 0:f782d9c66c49 72 \
dkato 0:f782d9c66c49 73 prof_units = "cycles"; \
dkato 0:f782d9c66c49 74 prof_cycle_t runs[PROF_RUNS]; \
dkato 0:f782d9c66c49 75 for (int i = 0; i < PROF_RUNS; i++) { \
dkato 0:f782d9c66c49 76 prof_accum_cycle = 0; \
dkato 0:f782d9c66c49 77 prof_iterations = 0; \
dkato 0:f782d9c66c49 78 func(__VA_ARGS__); \
dkato 0:f782d9c66c49 79 runs[i] = prof_accum_cycle / prof_iterations; \
dkato 0:f782d9c66c49 80 } \
dkato 0:f782d9c66c49 81 \
dkato 0:f782d9c66c49 82 prof_cycle_t res = runs[0]; \
dkato 0:f782d9c66c49 83 for (int i = 0; i < PROF_RUNS; i++) { \
dkato 0:f782d9c66c49 84 if (runs[i] < res) { \
dkato 0:f782d9c66c49 85 res = runs[i]; \
dkato 0:f782d9c66c49 86 } \
dkato 0:f782d9c66c49 87 } \
dkato 0:f782d9c66c49 88 res -= prof_baseline_cycle; \
dkato 0:f782d9c66c49 89 printf("\r%s: %"PRIu64" %s", #func, res, prof_units); \
dkato 0:f782d9c66c49 90 \
dkato 0:f782d9c66c49 91 if (!isatty(0)) { \
dkato 0:f782d9c66c49 92 prof_cycle_t prev; \
dkato 0:f782d9c66c49 93 while (scanf("%*[^0-9]%"PRIu64, &prev) == 0); \
dkato 0:f782d9c66c49 94 int64_t perc = 100*((int64_t)prev - (int64_t)res) / (int64_t)prev; \
dkato 0:f782d9c66c49 95 \
dkato 0:f782d9c66c49 96 if (perc > 10) { \
dkato 0:f782d9c66c49 97 printf(" (\e[32m%+"PRId64"%%\e[0m)", perc); \
dkato 0:f782d9c66c49 98 } else if (perc < -10) { \
dkato 0:f782d9c66c49 99 printf(" (\e[31m%+"PRId64"%%\e[0m)", perc); \
dkato 0:f782d9c66c49 100 } else { \
dkato 0:f782d9c66c49 101 printf(" (%+"PRId64"%%)", perc); \
dkato 0:f782d9c66c49 102 } \
dkato 0:f782d9c66c49 103 } \
dkato 0:f782d9c66c49 104 \
dkato 0:f782d9c66c49 105 printf("\n"); \
dkato 0:f782d9c66c49 106 res; \
dkato 0:f782d9c66c49 107 })
dkato 0:f782d9c66c49 108
dkato 0:f782d9c66c49 109 #define prof_baseline(func, ...) ({ \
dkato 0:f782d9c66c49 110 prof_baseline_cycle = 0; \
dkato 0:f782d9c66c49 111 prof_baseline_cycle = prof_measure(func, __VA_ARGS__); \
dkato 0:f782d9c66c49 112 })
dkato 0:f782d9c66c49 113
dkato 0:f782d9c66c49 114
dkato 0:f782d9c66c49 115 // Various test functions
dkato 0:f782d9c66c49 116 void no_func(void *eh) {
dkato 0:f782d9c66c49 117 }
dkato 0:f782d9c66c49 118
dkato 0:f782d9c66c49 119
dkato 0:f782d9c66c49 120 // Actual performance tests
dkato 0:f782d9c66c49 121 void baseline_prof(void) {
dkato 0:f782d9c66c49 122 prof_loop() {
dkato 0:f782d9c66c49 123 prof_start();
dkato 0:f782d9c66c49 124 __asm__ volatile ("");
dkato 0:f782d9c66c49 125 prof_stop();
dkato 0:f782d9c66c49 126 }
dkato 0:f782d9c66c49 127 }
dkato 0:f782d9c66c49 128
dkato 0:f782d9c66c49 129 void equeue_tick_prof(void) {
dkato 0:f782d9c66c49 130 prof_volatile(unsigned) res;
dkato 0:f782d9c66c49 131 prof_loop() {
dkato 0:f782d9c66c49 132 prof_start();
dkato 0:f782d9c66c49 133 res = equeue_tick();
dkato 0:f782d9c66c49 134 prof_stop();
dkato 0:f782d9c66c49 135 }
dkato 0:f782d9c66c49 136 }
dkato 0:f782d9c66c49 137
dkato 0:f782d9c66c49 138 void equeue_alloc_prof(void) {
dkato 0:f782d9c66c49 139 struct equeue q;
dkato 0:f782d9c66c49 140 equeue_create(&q, 32*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 141
dkato 0:f782d9c66c49 142 prof_loop() {
dkato 0:f782d9c66c49 143 prof_start();
dkato 0:f782d9c66c49 144 void *e = equeue_alloc(&q, 8 * sizeof(int));
dkato 0:f782d9c66c49 145 prof_stop();
dkato 0:f782d9c66c49 146
dkato 0:f782d9c66c49 147 equeue_dealloc(&q, e);
dkato 0:f782d9c66c49 148 }
dkato 0:f782d9c66c49 149
dkato 0:f782d9c66c49 150 equeue_destroy(&q);
dkato 0:f782d9c66c49 151 }
dkato 0:f782d9c66c49 152
dkato 0:f782d9c66c49 153 void equeue_alloc_many_prof(int count) {
dkato 0:f782d9c66c49 154 struct equeue q;
dkato 0:f782d9c66c49 155 equeue_create(&q, count*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 156
dkato 0:f782d9c66c49 157 void *es[count];
dkato 0:f782d9c66c49 158
dkato 0:f782d9c66c49 159 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 160 es[i] = equeue_alloc(&q, (i % 4) * sizeof(int));
dkato 0:f782d9c66c49 161 }
dkato 0:f782d9c66c49 162
dkato 0:f782d9c66c49 163 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 164 equeue_dealloc(&q, es[i]);
dkato 0:f782d9c66c49 165 }
dkato 0:f782d9c66c49 166
dkato 0:f782d9c66c49 167 prof_loop() {
dkato 0:f782d9c66c49 168 prof_start();
dkato 0:f782d9c66c49 169 void *e = equeue_alloc(&q, 8 * sizeof(int));
dkato 0:f782d9c66c49 170 prof_stop();
dkato 0:f782d9c66c49 171
dkato 0:f782d9c66c49 172 equeue_dealloc(&q, e);
dkato 0:f782d9c66c49 173 }
dkato 0:f782d9c66c49 174
dkato 0:f782d9c66c49 175 equeue_destroy(&q);
dkato 0:f782d9c66c49 176 }
dkato 0:f782d9c66c49 177
dkato 0:f782d9c66c49 178 void equeue_post_prof(void) {
dkato 0:f782d9c66c49 179 struct equeue q;
dkato 0:f782d9c66c49 180 equeue_create(&q, EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 181
dkato 0:f782d9c66c49 182 prof_loop() {
dkato 0:f782d9c66c49 183 void *e = equeue_alloc(&q, 0);
dkato 0:f782d9c66c49 184
dkato 0:f782d9c66c49 185 prof_start();
dkato 0:f782d9c66c49 186 int id = equeue_post(&q, no_func, e);
dkato 0:f782d9c66c49 187 prof_stop();
dkato 0:f782d9c66c49 188
dkato 0:f782d9c66c49 189 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 190 }
dkato 0:f782d9c66c49 191
dkato 0:f782d9c66c49 192 equeue_destroy(&q);
dkato 0:f782d9c66c49 193 }
dkato 0:f782d9c66c49 194
dkato 0:f782d9c66c49 195 void equeue_post_many_prof(int count) {
dkato 0:f782d9c66c49 196 struct equeue q;
dkato 0:f782d9c66c49 197 equeue_create(&q, count*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 198
dkato 0:f782d9c66c49 199 for (int i = 0; i < count-1; i++) {
dkato 0:f782d9c66c49 200 equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 201 }
dkato 0:f782d9c66c49 202
dkato 0:f782d9c66c49 203 prof_loop() {
dkato 0:f782d9c66c49 204 void *e = equeue_alloc(&q, 0);
dkato 0:f782d9c66c49 205
dkato 0:f782d9c66c49 206 prof_start();
dkato 0:f782d9c66c49 207 int id = equeue_post(&q, no_func, e);
dkato 0:f782d9c66c49 208 prof_stop();
dkato 0:f782d9c66c49 209
dkato 0:f782d9c66c49 210 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 211 }
dkato 0:f782d9c66c49 212
dkato 0:f782d9c66c49 213 equeue_destroy(&q);
dkato 0:f782d9c66c49 214 }
dkato 0:f782d9c66c49 215
dkato 0:f782d9c66c49 216 void equeue_post_future_prof(void) {
dkato 0:f782d9c66c49 217 struct equeue q;
dkato 0:f782d9c66c49 218 equeue_create(&q, EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 219
dkato 0:f782d9c66c49 220 prof_loop() {
dkato 0:f782d9c66c49 221 void *e = equeue_alloc(&q, 0);
dkato 0:f782d9c66c49 222 equeue_event_delay(e, 1000);
dkato 0:f782d9c66c49 223
dkato 0:f782d9c66c49 224 prof_start();
dkato 0:f782d9c66c49 225 int id = equeue_post(&q, no_func, e);
dkato 0:f782d9c66c49 226 prof_stop();
dkato 0:f782d9c66c49 227
dkato 0:f782d9c66c49 228 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 229 }
dkato 0:f782d9c66c49 230
dkato 0:f782d9c66c49 231 equeue_destroy(&q);
dkato 0:f782d9c66c49 232 }
dkato 0:f782d9c66c49 233
dkato 0:f782d9c66c49 234 void equeue_post_future_many_prof(int count) {
dkato 0:f782d9c66c49 235 struct equeue q;
dkato 0:f782d9c66c49 236 equeue_create(&q, count*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 237
dkato 0:f782d9c66c49 238 for (int i = 0; i < count-1; i++) {
dkato 0:f782d9c66c49 239 equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 240 }
dkato 0:f782d9c66c49 241
dkato 0:f782d9c66c49 242 prof_loop() {
dkato 0:f782d9c66c49 243 void *e = equeue_alloc(&q, 0);
dkato 0:f782d9c66c49 244 equeue_event_delay(e, 1000);
dkato 0:f782d9c66c49 245
dkato 0:f782d9c66c49 246 prof_start();
dkato 0:f782d9c66c49 247 int id = equeue_post(&q, no_func, e);
dkato 0:f782d9c66c49 248 prof_stop();
dkato 0:f782d9c66c49 249
dkato 0:f782d9c66c49 250 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 251 }
dkato 0:f782d9c66c49 252
dkato 0:f782d9c66c49 253 equeue_destroy(&q);
dkato 0:f782d9c66c49 254 }
dkato 0:f782d9c66c49 255
dkato 0:f782d9c66c49 256 void equeue_dispatch_prof(void) {
dkato 0:f782d9c66c49 257 struct equeue q;
dkato 0:f782d9c66c49 258 equeue_create(&q, EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 259
dkato 0:f782d9c66c49 260 prof_loop() {
dkato 0:f782d9c66c49 261 equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 262
dkato 0:f782d9c66c49 263 prof_start();
dkato 0:f782d9c66c49 264 equeue_dispatch(&q, 0);
dkato 0:f782d9c66c49 265 prof_stop();
dkato 0:f782d9c66c49 266 }
dkato 0:f782d9c66c49 267
dkato 0:f782d9c66c49 268 equeue_destroy(&q);
dkato 0:f782d9c66c49 269 }
dkato 0:f782d9c66c49 270
dkato 0:f782d9c66c49 271 void equeue_dispatch_many_prof(int count) {
dkato 0:f782d9c66c49 272 struct equeue q;
dkato 0:f782d9c66c49 273 equeue_create(&q, count*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 274
dkato 0:f782d9c66c49 275 prof_loop() {
dkato 0:f782d9c66c49 276 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 277 equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 278 }
dkato 0:f782d9c66c49 279
dkato 0:f782d9c66c49 280 prof_start();
dkato 0:f782d9c66c49 281 equeue_dispatch(&q, 0);
dkato 0:f782d9c66c49 282 prof_stop();
dkato 0:f782d9c66c49 283 }
dkato 0:f782d9c66c49 284
dkato 0:f782d9c66c49 285 equeue_destroy(&q);
dkato 0:f782d9c66c49 286 }
dkato 0:f782d9c66c49 287
dkato 0:f782d9c66c49 288 void equeue_cancel_prof(void) {
dkato 0:f782d9c66c49 289 struct equeue q;
dkato 0:f782d9c66c49 290 equeue_create(&q, EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 291
dkato 0:f782d9c66c49 292 prof_loop() {
dkato 0:f782d9c66c49 293 int id = equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 294
dkato 0:f782d9c66c49 295 prof_start();
dkato 0:f782d9c66c49 296 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 297 prof_stop();
dkato 0:f782d9c66c49 298 }
dkato 0:f782d9c66c49 299
dkato 0:f782d9c66c49 300 equeue_destroy(&q);
dkato 0:f782d9c66c49 301 }
dkato 0:f782d9c66c49 302
dkato 0:f782d9c66c49 303 void equeue_cancel_many_prof(int count) {
dkato 0:f782d9c66c49 304 struct equeue q;
dkato 0:f782d9c66c49 305 equeue_create(&q, count*EQUEUE_EVENT_SIZE);
dkato 0:f782d9c66c49 306
dkato 0:f782d9c66c49 307 for (int i = 0; i < count-1; i++) {
dkato 0:f782d9c66c49 308 equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 309 }
dkato 0:f782d9c66c49 310
dkato 0:f782d9c66c49 311 prof_loop() {
dkato 0:f782d9c66c49 312 int id = equeue_call(&q, no_func, 0);
dkato 0:f782d9c66c49 313
dkato 0:f782d9c66c49 314 prof_start();
dkato 0:f782d9c66c49 315 equeue_cancel(&q, id);
dkato 0:f782d9c66c49 316 prof_stop();
dkato 0:f782d9c66c49 317 }
dkato 0:f782d9c66c49 318
dkato 0:f782d9c66c49 319 equeue_destroy(&q);
dkato 0:f782d9c66c49 320 }
dkato 0:f782d9c66c49 321
dkato 0:f782d9c66c49 322 void equeue_alloc_size_prof(void) {
dkato 0:f782d9c66c49 323 size_t size = 32*EQUEUE_EVENT_SIZE;
dkato 0:f782d9c66c49 324
dkato 0:f782d9c66c49 325 struct equeue q;
dkato 0:f782d9c66c49 326 equeue_create(&q, size);
dkato 0:f782d9c66c49 327 equeue_alloc(&q, 0);
dkato 0:f782d9c66c49 328
dkato 0:f782d9c66c49 329 prof_result(size - q.slab.size, "bytes");
dkato 0:f782d9c66c49 330
dkato 0:f782d9c66c49 331 equeue_destroy(&q);
dkato 0:f782d9c66c49 332 }
dkato 0:f782d9c66c49 333
dkato 0:f782d9c66c49 334 void equeue_alloc_many_size_prof(int count) {
dkato 0:f782d9c66c49 335 size_t size = count*EQUEUE_EVENT_SIZE;
dkato 0:f782d9c66c49 336
dkato 0:f782d9c66c49 337 struct equeue q;
dkato 0:f782d9c66c49 338 equeue_create(&q, size);
dkato 0:f782d9c66c49 339
dkato 0:f782d9c66c49 340 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 341 equeue_alloc(&q, (i % 4) * sizeof(int));
dkato 0:f782d9c66c49 342 }
dkato 0:f782d9c66c49 343
dkato 0:f782d9c66c49 344 prof_result(size - q.slab.size, "bytes");
dkato 0:f782d9c66c49 345
dkato 0:f782d9c66c49 346 equeue_destroy(&q);
dkato 0:f782d9c66c49 347 }
dkato 0:f782d9c66c49 348
dkato 0:f782d9c66c49 349 void equeue_alloc_fragmented_size_prof(int count) {
dkato 0:f782d9c66c49 350 size_t size = count*EQUEUE_EVENT_SIZE;
dkato 0:f782d9c66c49 351
dkato 0:f782d9c66c49 352 struct equeue q;
dkato 0:f782d9c66c49 353 equeue_create(&q, size);
dkato 0:f782d9c66c49 354
dkato 0:f782d9c66c49 355 void *es[count];
dkato 0:f782d9c66c49 356
dkato 0:f782d9c66c49 357 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 358 es[i] = equeue_alloc(&q, (i % 4) * sizeof(int));
dkato 0:f782d9c66c49 359 }
dkato 0:f782d9c66c49 360
dkato 0:f782d9c66c49 361 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 362 equeue_dealloc(&q, es[i]);
dkato 0:f782d9c66c49 363 }
dkato 0:f782d9c66c49 364
dkato 0:f782d9c66c49 365 for (int i = count-1; i >= 0; i--) {
dkato 0:f782d9c66c49 366 es[i] = equeue_alloc(&q, (i % 4) * sizeof(int));
dkato 0:f782d9c66c49 367 }
dkato 0:f782d9c66c49 368
dkato 0:f782d9c66c49 369 for (int i = count-1; i >= 0; i--) {
dkato 0:f782d9c66c49 370 equeue_dealloc(&q, es[i]);
dkato 0:f782d9c66c49 371 }
dkato 0:f782d9c66c49 372
dkato 0:f782d9c66c49 373 for (int i = 0; i < count; i++) {
dkato 0:f782d9c66c49 374 equeue_alloc(&q, (i % 4) * sizeof(int));
dkato 0:f782d9c66c49 375 }
dkato 0:f782d9c66c49 376
dkato 0:f782d9c66c49 377 prof_result(size - q.slab.size, "bytes");
dkato 0:f782d9c66c49 378
dkato 0:f782d9c66c49 379 equeue_destroy(&q);
dkato 0:f782d9c66c49 380 }
dkato 0:f782d9c66c49 381
dkato 0:f782d9c66c49 382
dkato 0:f782d9c66c49 383 // Entry point
dkato 0:f782d9c66c49 384 int main() {
dkato 0:f782d9c66c49 385 printf("beginning profiling...\n");
dkato 0:f782d9c66c49 386
dkato 0:f782d9c66c49 387 prof_baseline(baseline_prof);
dkato 0:f782d9c66c49 388
dkato 0:f782d9c66c49 389 prof_measure(equeue_tick_prof);
dkato 0:f782d9c66c49 390 prof_measure(equeue_alloc_prof);
dkato 0:f782d9c66c49 391 prof_measure(equeue_post_prof);
dkato 0:f782d9c66c49 392 prof_measure(equeue_post_future_prof);
dkato 0:f782d9c66c49 393 prof_measure(equeue_dispatch_prof);
dkato 0:f782d9c66c49 394 prof_measure(equeue_cancel_prof);
dkato 0:f782d9c66c49 395
dkato 0:f782d9c66c49 396 prof_measure(equeue_alloc_many_prof, 1000);
dkato 0:f782d9c66c49 397 prof_measure(equeue_post_many_prof, 1000);
dkato 0:f782d9c66c49 398 prof_measure(equeue_post_future_many_prof, 1000);
dkato 0:f782d9c66c49 399 prof_measure(equeue_dispatch_many_prof, 100);
dkato 0:f782d9c66c49 400 prof_measure(equeue_cancel_many_prof, 100);
dkato 0:f782d9c66c49 401
dkato 0:f782d9c66c49 402 prof_measure(equeue_alloc_size_prof);
dkato 0:f782d9c66c49 403 prof_measure(equeue_alloc_many_size_prof, 1000);
dkato 0:f782d9c66c49 404 prof_measure(equeue_alloc_fragmented_size_prof, 1000);
dkato 0:f782d9c66c49 405
dkato 0:f782d9c66c49 406 printf("done!\n");
dkato 0:f782d9c66c49 407 }