]>
Commit | Line | Data |
---|---|---|
acddc0ed | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
ba32db1e CF |
2 | /* |
3 | * Test program which measures the time it takes to schedule and | |
4 | * remove timers. | |
5 | * | |
6 | * Copyright (C) 2013 by Open Source Routing. | |
7 | * Copyright (C) 2013 by Internet Systems Consortium, Inc. ("ISC") | |
8 | * | |
9 | * This file is part of Quagga | |
ba32db1e | 10 | */ |
ba32db1e CF |
11 | |
12 | #include <zebra.h> | |
13 | ||
7a2fbbf0 DL |
14 | #include <stdio.h> |
15 | #include <unistd.h> | |
16 | ||
cb37cb33 | 17 | #include "event.h" |
ba32db1e CF |
18 | #include "prng.h" |
19 | ||
20 | #define SCHEDULE_TIMERS 1000000 | |
21 | #define REMOVE_TIMERS 500000 | |
22 | ||
cd9d0537 | 23 | struct event_loop *master; |
ba32db1e | 24 | |
e6685141 | 25 | static void dummy_func(struct event *thread) |
ba32db1e | 26 | { |
ba32db1e CF |
27 | } |
28 | ||
29 | int main(int argc, char **argv) | |
30 | { | |
d62a17ae | 31 | struct prng *prng; |
32 | int i; | |
e6685141 | 33 | struct event **timers; |
d62a17ae | 34 | struct timeval tv_start, tv_lap, tv_stop; |
35 | unsigned long t_schedule, t_remove; | |
36 | ||
ce50d11c | 37 | master = event_master_create(NULL); |
d62a17ae | 38 | prng = prng_new(0); |
39 | timers = calloc(SCHEDULE_TIMERS, sizeof(*timers)); | |
40 | ||
41 | /* create thread structures so they won't be allocated during the | |
42 | * time measurement */ | |
43 | for (i = 0; i < SCHEDULE_TIMERS; i++) { | |
907a2395 | 44 | event_add_timer_msec(master, dummy_func, NULL, 0, &timers[i]); |
d62a17ae | 45 | } |
46 | for (i = 0; i < SCHEDULE_TIMERS; i++) | |
332beb64 | 47 | event_cancel(&timers[i]); |
d62a17ae | 48 | |
49 | monotime(&tv_start); | |
50 | ||
51 | for (i = 0; i < SCHEDULE_TIMERS; i++) { | |
52 | long interval_msec; | |
53 | ||
54 | interval_msec = prng_rand(prng) % (100 * SCHEDULE_TIMERS); | |
907a2395 DS |
55 | event_add_timer_msec(master, dummy_func, NULL, interval_msec, |
56 | &timers[i]); | |
d62a17ae | 57 | } |
58 | ||
59 | monotime(&tv_lap); | |
60 | ||
61 | for (i = 0; i < REMOVE_TIMERS; i++) { | |
62 | int index; | |
63 | ||
64 | index = prng_rand(prng) % SCHEDULE_TIMERS; | |
332beb64 | 65 | event_cancel(&timers[index]); |
d62a17ae | 66 | } |
67 | ||
68 | monotime(&tv_stop); | |
69 | ||
70 | t_schedule = 1000 * (tv_lap.tv_sec - tv_start.tv_sec); | |
71 | t_schedule += (tv_lap.tv_usec - tv_start.tv_usec) / 1000; | |
72 | ||
73 | t_remove = 1000 * (tv_stop.tv_sec - tv_lap.tv_sec); | |
74 | t_remove += (tv_stop.tv_usec - tv_lap.tv_usec) / 1000; | |
75 | ||
2ec42b85 | 76 | printf("Scheduling %d random timers took %lu.%03lu seconds.\n", |
d62a17ae | 77 | SCHEDULE_TIMERS, t_schedule / 1000, t_schedule % 1000); |
2ec42b85 | 78 | printf("Removing %d random timers took %lu.%03lu seconds.\n", |
d62a17ae | 79 | REMOVE_TIMERS, t_remove / 1000, t_remove % 1000); |
80 | fflush(stdout); | |
81 | ||
82 | free(timers); | |
ce50d11c | 83 | event_master_free(master); |
d62a17ae | 84 | prng_free(prng); |
85 | return 0; | |
ba32db1e | 86 | } |