eda40b2156737ae83e19c20f2611179a9e341f86
[lttng-tools.git] / benchmark.c
1 /*
2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; only version 2
7 * of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19 #include <stdio.h>
20 #include <string.h>
21 #include <sys/time.h>
22 #include <unistd.h>
23
24 #include "benchmark.h"
25
26 FILE *fp;
27 static double g_freq;
28
29 static double calibrate_cpu_freq(void)
30 {
31 int i, nb_calib = 10;
32 double freq;
33
34 printf("CPU frequency calibration, this should take 10 seconds\n");
35
36 /* CPU Frequency calibration */
37 for (i = 0; i < nb_calib; i++) {
38 freq += (double) get_cpu_freq();
39 }
40 return (freq / (double)nb_calib);
41 }
42
43 static void close_logs(void)
44 {
45 fclose(fp);
46 }
47
48 static void open_logs(void)
49 {
50 fp = fopen(RESULTS_FILE_NAME, "a");
51 if (fp == NULL) {
52 perror("fopen benchmark");
53 }
54 }
55
56 static double get_bench_time(cycles_t before, cycles_t after)
57 {
58 double ret;
59
60 ret = (((double)(after - before) / (g_freq / 1000.0)) / 1000000000.0);
61
62 return ret;
63 }
64
65 void bench_init(void)
66 {
67 open_logs();
68 if (g_freq == 0) {
69 g_freq = calibrate_cpu_freq();
70 //fprintf(fp, "CPU frequency %f Ghz\n\n", g_freq);
71 }
72 }
73
74 void bench_close(void)
75 {
76 close_logs();
77 printf("Benchmark results in %s\n", RESULTS_FILE_NAME);
78 }
79
80 double bench_get_create_session(void)
81 {
82 if ((time_create_session_start == 0) &&
83 (time_create_session_end == 0)) {
84 fprintf(fp, "NO DATA\n");
85 return 0;
86 }
87
88 return get_bench_time(time_create_session_start, time_create_session_end);
89 }
90
91 double bench_get_destroy_session(void)
92 {
93 if ((time_destroy_session_start == 0) &&
94 (time_destroy_session_end == 0)) {
95 fprintf(fp, "NO DATA\n");
96 return 0;
97 }
98
99 return get_bench_time(time_destroy_session_start, time_destroy_session_end);
100 }
101
102 /*
103 * Log results of the sessiond boot process.
104 *
105 * Uses all time_sessiond_* values (see measures.h)
106 */
107 void bench_print_boot_process(void)
108 {
109 double res;
110 double global_boot_time = 0.0;
111
112 fprintf(fp, "--- Session daemon boot process ---\n");
113
114 res = get_bench_time(time_sessiond_boot_start, time_sessiond_boot_end);
115
116 fprintf(fp, "Boot time inside main() from start to first pthread_join (blocking state)\n");
117 fprintf(fp, "Time: %.20f sec.\n", res);
118
119 global_boot_time += res;
120
121 res = get_bench_time(time_sessiond_th_kern_start, time_sessiond_th_kern_poll);
122
123 fprintf(fp, "Boot time of the kernel thread from start to poll() (ready state)\n");
124 fprintf(fp, "Time: %.20f sec.\n", res);
125
126 global_boot_time += res;
127
128 res = get_bench_time(time_sessiond_th_apps_start, time_sessiond_th_apps_poll);
129
130 fprintf(fp, "Boot time of the application thread from start to poll() (ready state)\n");
131 fprintf(fp, "Time: %.20f sec.\n", res);
132
133 global_boot_time += res;
134
135 res = get_bench_time(time_sessiond_th_cli_start, time_sessiond_th_cli_poll);
136
137 fprintf(fp, "Boot time of the client thread from start to poll() (ready state)\n");
138 fprintf(fp, "Time: %.20f sec.\n", res);
139
140 global_boot_time += res;
141
142 fprintf(fp, "Global Boot Time of ltt-sessiond: %0.20f sec.\n", global_boot_time);
143 }
This page took 0.041445 seconds and 3 git commands to generate.