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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
46e5f4a5282d Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 19173
diff changeset
15 i_assert(input_size > 0);
46e5f4a5282d Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 19173
diff changeset
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
a1c9e2cc574b lib: Added timing_get_sum()
Timo Sirainen <tss@iki.fi>
parents: 19180
diff changeset
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 }