Mercurial > dovecot > core-2.2
annotate src/lib/test-timing.c @ 22955:812e5c961328
fts: Indexing virtual mailbox didn't always index the last mails
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 03 May 2018 18:33:00 +0300 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */ |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "test-lib.h" |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "timing.h" |
19173
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
5 #include "sort.h" |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 static void |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 test_timing_verify(const struct timing *t, const int64_t *input, |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 unsigned int input_size) |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 uint64_t min = INT_MAX, max = 0, sum = 0; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 uint64_t *copy; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 unsigned int i; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
19180 | 15 i_assert(input_size > 0); |
16 | |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 copy = i_new(uint64_t, input_size); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 for (i = 0; i < input_size; i++) { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 uint64_t value = input[i]; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 if (min > value) |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 min = value; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 if (max < value) |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 max = value; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 sum += value; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 copy[i] = value; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 } |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 i_qsort(copy, input_size, sizeof(*copy), uint64_cmp); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 test_assert_idx(timing_get_count(t) == input_size, input_size); |
19183 | 31 test_assert_idx(timing_get_sum(t) == sum, input_size); |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 test_assert_idx(timing_get_min(t) == min, input_size); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 test_assert_idx(timing_get_max(t) == max, input_size); |
19173
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
34 test_assert_idx(timing_get_avg(t) == (sum + input_size/2)/input_size, input_size); |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
35 |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
36 /* these aren't always fully accurate: */ |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
37 test_assert_idx(timing_get_median(t) >= copy[(input_size-1)/2] && |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
38 timing_get_median(t) <= copy[input_size/2], |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
39 input_size); |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
40 /* when we have 20 elements, [19] is the max, not the 95th %ile, so subtract 1 */ |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
41 test_assert_idx(timing_get_95th(t) == copy[input_size*95/100 - !(input_size%20)], |
2f492fac75b7
lib: timings - added quantiles
Phil Carmody <phil@dovecot.fi>
parents:
19172
diff
changeset
|
42 input_size); |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 i_free(copy); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 void test_timing(void) |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 static int64_t test_input1[] = { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 20, 19, 18, 1, 2, 3, 4, 5, 6, 7, 8, |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 9, 10, 11, 12, 13, 14, 15, 16, 17, -1 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 }; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 static int64_t test_input2[] = { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 20, 21, 19, 18, 1, 2, 3, 4, 5, 6, 7, 8, |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 9, 10, 11, 12, 13, 14, 15, 16, 17, -1 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 }; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 static int64_t test_input3[] = { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 20, 21, 19, 18, 1, 2, 3, 4, 5, 6, 7, 8, |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 9, 10, 11, 12, 13, 14, 15, 16, 17, 22, -1 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 }; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 static int64_t *test_inputs[] = { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 test_input1, test_input2, test_input3 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 }; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 struct timing *t; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 unsigned int i, j; |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 for (i = 0; i < N_ELEMENTS(test_inputs); i++) { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 test_begin(t_strdup_printf("timings %u", i)); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 t = timing_init(); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 for (j = 0; test_inputs[i][j] >= 0; j++) { |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 timing_add_usecs(t, test_inputs[i][j]); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 test_timing_verify(t, test_inputs[i], j+1); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
20198
1779df80df17
lib: Added timing_reset()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
74 timing_reset(t); |
1779df80df17
lib: Added timing_reset()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
75 test_assert(timing_get_count(t) == 0); |
1779df80df17
lib: Added timing_reset()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
76 test_assert(timing_get_max(t) == 0); |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 timing_deinit(&t); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 test_end(); |
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 } |
20199
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
80 |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
81 test_begin("timings large"); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
82 t = timing_init(); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
83 for (i = 0; i < 10000; i++) |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
84 timing_add_usecs(t, i); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
85 test_assert(timing_get_count(t) == i); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
86 test_assert(timing_get_sum(t) == (i-1)*i/2); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
87 test_assert(timing_get_min(t) == 0); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
88 test_assert(timing_get_max(t) == i-1); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
89 test_assert(timing_get_avg(t) == i/2); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
90 /* just test that these work: */ |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
91 test_assert(timing_get_median(t) > 0 && timing_get_median(t) < i-1); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
92 test_assert(timing_get_95th(t) > 0 && timing_get_95th(t) < i-1); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
93 timing_deinit(&t); |
a4744c321f18
lib: Fixed crashes in timing_get_median() and timing_get_95th()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20198
diff
changeset
|
94 test_end(); |
19147
9add45266550
lib: Added a simple timing.h API for tracking min/max/avg for events.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 } |