BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

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