2 * Copyright (C) 2011 - David Goulet <david.goulet@polymtl.ca>
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
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.
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.
24 #include "benchmark.h"
29 static double calibrate_cpu_freq(void)
34 printf("CPU frequency calibration, this should take 10 seconds\n");
36 /* CPU Frequency calibration */
37 for (i
= 0; i
< nb_calib
; i
++) {
38 freq
+= (double) get_cpu_freq();
41 return (freq
/ (double)nb_calib
);
44 static void close_logs(void)
49 static void open_logs(void)
51 fp
= fopen(RESULTS_FILE_NAME
, "a");
53 perror("fopen benchmark");
57 static double get_bench_time(cycles_t before
, cycles_t after
)
61 ret
= (((double)(after
- before
) / (g_freq
/ 1000.0)) / 1000000000.0);
70 g_freq
= calibrate_cpu_freq();
71 //fprintf(fp, "CPU frequency %f Ghz\n\n", g_freq);
75 void bench_close(void)
78 printf("Benchmark results in %s\n", RESULTS_FILE_NAME
);
81 double bench_get_create_session(void)
83 if ((time_create_session_start
== 0) &&
84 (time_create_session_end
== 0)) {
85 fprintf(fp
, "NO DATA\n");
89 return get_bench_time(time_create_session_start
, time_create_session_end
);
92 double bench_get_destroy_session(void)
94 if ((time_destroy_session_start
== 0) &&
95 (time_destroy_session_end
== 0)) {
96 fprintf(fp
, "NO DATA\n");
100 return get_bench_time(time_destroy_session_start
, time_destroy_session_end
);
104 * Complete UST notification process time break down in different actions.
106 void bench_print_ust_notification(void)
108 double res
, total
= 0;
110 fprintf(fp
, "--- UST notification time ---\n");
112 if (time_ust_notify_mmap_start
== 0 || time_ust_notify_mmap_stop
== 0) {
116 res
= get_bench_time(time_ust_notify_mmap_start
,
117 time_ust_notify_mmap_stop
);
118 fprintf(fp
, "mmap() call time\n");
119 fprintf(fp
, "Time: %.20f sec.\n", res
);
123 if (time_ust_notify_perms_start
== 0 || time_ust_notify_perms_stop
== 0) {
127 res
= get_bench_time(time_ust_notify_perms_start
,
128 time_ust_notify_perms_stop
);
129 fprintf(fp
, "Setting permissions (chown/chmod)\n");
130 fprintf(fp
, "Time: %.20f sec.\n", res
);
134 if (time_ust_notify_shm_start
== 0 || time_ust_notify_shm_stop
== 0) {
138 res
= get_bench_time(time_ust_notify_shm_start
,
139 time_ust_notify_shm_stop
);
140 fprintf(fp
, "shm_open/ftruncate/fchmod\n");
141 fprintf(fp
, "Time: %.20f sec.\n", res
);
145 if (time_ust_notify_apps_start
== 0 || time_ust_notify_apps_stop
== 0) {
149 res
= get_bench_time(time_ust_notify_apps_start
,
150 time_ust_notify_apps_stop
);
151 fprintf(fp
, "futex wake\n");
152 fprintf(fp
, "Time: %.20f sec.\n", res
);
156 fprintf(fp
, "Global UST nonification time\n");
157 fprintf(fp
, "Time: %.20f sec.\n", total
);
161 fprintf(fp
, "NO DATA\n");
166 * Time taken by an UST apps to unregister.
168 void bench_print_ust_unregister(void)
172 fprintf(fp
, "--- UST unregister time ---\n");
174 if (time_ust_unregister_start
== 0 || time_ust_unregister_stop
== 0) {
178 res
= get_bench_time(time_ust_unregister_start
, time_ust_unregister_stop
);
179 fprintf(fp
, "UST unregister time\n");
180 fprintf(fp
, "Time: %.20f sec.\n", res
);
184 fprintf(fp
, "NO DATA\n");
189 * This time value is only coherent is an UST application registered.
191 void bench_print_ust_register(void)
193 double res
, total
= 0;
195 fprintf(fp
, "--- UST registration time ---\n");
197 if (time_ust_register_start
== 0 || time_ust_register_stop
== 0) {
201 res
= get_bench_time(time_ust_register_start
, time_ust_register_stop
);
202 fprintf(fp
, "UST registration received and send to dispatch time\n");
203 fprintf(fp
, "Time: %.20f sec.\n", res
);
207 if (time_ust_dispatch_register_start
== 0 ||
208 time_ust_dispatch_register_stop
== 0) {
212 res
= get_bench_time(time_ust_dispatch_register_start
,
213 time_ust_dispatch_register_stop
);
214 fprintf(fp
, "Dispatch UST registration request time\n");
215 fprintf(fp
, "Time: %.20f sec.\n", res
);
219 fprintf(fp
, "--> Manage registration breakdown\n");
221 res
= get_bench_time(time_ust_register_read_start
,
222 time_ust_register_read_stop
);
223 fprintf(fp
, "read() from pipe time\n");
224 fprintf(fp
, "Time: %.20f sec.\n", res
);
228 res
= get_bench_time(time_ust_register_add_start
,
229 time_ust_register_add_stop
);
230 fprintf(fp
, "register_traceable_app time\n");
231 fprintf(fp
, "Time: %.20f sec.\n", res
);
235 res
= get_bench_time(time_ust_register_done_start
,
236 time_ust_register_done_stop
);
237 fprintf(fp
, "send register done command time\n");
238 fprintf(fp
, "Time: %.20f sec.\n", res
);
242 fprintf(fp
, "Global time of an UST application registration\n");
243 fprintf(fp
, "Time: %.20f sec.\n", total
);
247 fprintf(fp
, "NO DATA\n");
253 * Log results of the sessiond boot process.
255 * Uses all time_sessiond_* values (see measures.h)
257 void bench_print_boot_process(void)
260 double global_boot_time
= 0.0;
262 fprintf(fp
, "--- Session daemon boot process ---\n");
264 res
= get_bench_time(time_sessiond_boot_start
, time_sessiond_boot_end
);
266 fprintf(fp
, "Inside main() from start to first pthread_join"
267 "(blocking state)\n");
268 fprintf(fp
, "Time: %.20f sec.\n", res
);
270 global_boot_time
+= res
;
272 res
= get_bench_time(time_sessiond_th_kern_start
,
273 time_sessiond_th_kern_poll
);
275 fprintf(fp
, "Kernel thread from start to poll() (ready state)\n");
276 fprintf(fp
, "Time: %.20f sec.\n", res
);
278 global_boot_time
+= res
;
280 res
= get_bench_time(time_sessiond_th_apps_start
,
281 time_sessiond_th_apps_poll
);
283 fprintf(fp
, "Application thread from start to poll() (ready state)\n");
284 fprintf(fp
, "Time: %.20f sec.\n", res
);
286 global_boot_time
+= res
;
288 res
= get_bench_time(time_sessiond_th_cli_start
,
289 time_sessiond_th_cli_poll
);
291 fprintf(fp
, "Client thread from start to poll() (ready state)\n");
292 fprintf(fp
, "Time: %.20f sec.\n", res
);
294 global_boot_time
+= res
;
296 res
= get_bench_time(time_sessiond_th_dispatch_start
,
297 time_sessiond_th_dispatch_block
);
299 fprintf(fp
, "Dispatch registration thread from start to poll()"
301 fprintf(fp
, "Time: %.20f sec.\n", res
);
303 global_boot_time
+= res
;
305 fprintf(fp
, "Global Boot Time\n");
306 fprintf(fp
, "Time: %0.20f sec.\n", global_boot_time
);