1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2021 Intel Corporation.
3 * All rights reserved.
4 */
5
6 #include "spdk/stdinc.h"
7 #include "spdk/zipf.h"
8 #include "spdk/histogram_data.h"
9 #include "spdk/string.h"
10
11 static void
usage(const char * prog)12 usage(const char *prog)
13 {
14 printf("usage: %s <theta> <range> <count>\n", prog);
15 }
16
17 static void
print_bucket(void * ctx,uint64_t start,uint64_t end,uint64_t count,uint64_t total,uint64_t so_far)18 print_bucket(void *ctx, uint64_t start, uint64_t end, uint64_t count,
19 uint64_t total, uint64_t so_far)
20 {
21 double so_far_pct;
22 char range[64];
23
24 if (count == 0) {
25 return;
26 }
27
28 so_far_pct = (double)so_far * 100 / total;
29 snprintf(range, sizeof(range), "[%ju, %ju)", start, end);
30 printf("%24s: %9.4f%% (%9ju)\n", range, so_far_pct, count);
31 }
32
33 int
main(int argc,char ** argv)34 main(int argc, char **argv)
35 {
36 struct spdk_zipf *zipf;
37 struct spdk_histogram_data *h;
38 float theta;
39 int range, count, i;
40
41 if (argc < 4) {
42 usage(argv[0]);
43 return 1;
44 }
45
46 theta = atof(argv[1]);
47 range = spdk_strtol(argv[2], 10);
48 count = spdk_strtol(argv[3], 10);
49
50 if (range <= 0 || count <= 0) {
51 printf("range and count must be positive integers\n");
52 usage(argv[0]);
53 return 1;
54 }
55
56 zipf = spdk_zipf_create(range, theta, time(NULL));
57 h = spdk_histogram_data_alloc();
58 if (zipf == NULL || h == NULL) {
59 spdk_zipf_free(&zipf);
60 spdk_histogram_data_free(h);
61 printf("out of resource\n");
62 return 1;
63 }
64
65 for (i = 0; i < count; i++) {
66 spdk_histogram_data_tally(h, spdk_zipf_generate(zipf));
67 }
68
69 spdk_histogram_data_iterate(h, print_bucket, NULL);
70 spdk_histogram_data_free(h);
71 spdk_zipf_free(&zipf);
72
73 return 0;
74 }
75