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();
40 return (freq
/ (double)nb_calib
);
43 static void close_logs(void)
48 static void open_logs(void)
50 fp
= fopen(RESULTS_FILE_NAME
, "a");
52 perror("fopen benchmark");
56 static double get_bench_time(cycles_t before
, cycles_t after
)
60 ret
= (((double)(after
- before
) / (g_freq
/ 1000.0)) / 1000000000.0);
69 g_freq
= calibrate_cpu_freq();
70 //fprintf(fp, "CPU frequency %f Ghz\n\n", g_freq);
74 void bench_close(void)
77 printf("Benchmark results in %s\n", RESULTS_FILE_NAME
);
80 double bench_get_create_session(void)
82 if ((time_create_session_start
== 0) &&
83 (time_create_session_end
== 0)) {
84 fprintf(fp
, "NO DATA\n");
88 return get_bench_time(time_create_session_start
, time_create_session_end
);
91 double bench_get_destroy_session(void)
93 if ((time_destroy_session_start
== 0) &&
94 (time_destroy_session_end
== 0)) {
95 fprintf(fp
, "NO DATA\n");
99 return get_bench_time(time_destroy_session_start
, time_destroy_session_end
);
103 * Complete UST notification process time break down in different actions.
105 void bench_print_ust_notification(void)
107 double res
, total
= 0;
109 fprintf(fp
, "--- UST notification time ---\n");
111 if (time_ust_notify_mmap_start
== 0 || time_ust_notify_mmap_stop
== 0) {
115 res
= get_bench_time(time_ust_notify_mmap_start
,
116 time_ust_notify_mmap_stop
);
117 fprintf(fp
, "mmap() call time\n");
118 fprintf(fp
, "Time: %.20f sec.\n", res
);
122 if (time_ust_notify_perms_start
== 0 || time_ust_notify_perms_stop
== 0) {
126 res
= get_bench_time(time_ust_notify_perms_start
,
127 time_ust_notify_perms_stop
);
128 fprintf(fp
, "Setting permissions (chown/chmod)\n");
129 fprintf(fp
, "Time: %.20f sec.\n", res
);
133 if (time_ust_notify_shm_start
== 0 || time_ust_notify_shm_stop
== 0) {
137 res
= get_bench_time(time_ust_notify_shm_start
,
138 time_ust_notify_shm_stop
);
139 fprintf(fp
, "shm_open/ftruncate/fchmod\n");
140 fprintf(fp
, "Time: %.20f sec.\n", res
);
144 fprintf(fp
, "Global UST nonification time\n");
145 fprintf(fp
, "Time: %.20f sec.\n", total
);
149 fprintf(fp
, "NO DATA\n");
154 * Time taken by an UST apps to unregister.
156 void bench_print_ust_unregister(void)
160 fprintf(fp
, "--- UST unregister time ---\n");
162 if (time_ust_unregister_start
== 0 || time_ust_unregister_stop
== 0) {
166 res
= get_bench_time(time_ust_unregister_start
, time_ust_unregister_stop
);
167 fprintf(fp
, "UST unregister time\n");
168 fprintf(fp
, "Time: %.20f sec.\n", res
);
172 fprintf(fp
, "NO DATA\n");
177 * This time value is only coherent is an UST application registered.
179 void bench_print_ust_register(void)
181 double res
, total
= 0;
183 fprintf(fp
, "--- UST registration time ---\n");
185 if (time_ust_register_start
== 0 || time_ust_register_stop
== 0) {
189 res
= get_bench_time(time_ust_register_start
, time_ust_register_stop
);
190 fprintf(fp
, "UST registration received and send to dispatch time\n");
191 fprintf(fp
, "Time: %.20f sec.\n", res
);
195 if (time_ust_dispatch_register_start
== 0 ||
196 time_ust_dispatch_register_stop
== 0) {
200 res
= get_bench_time(time_ust_dispatch_register_start
,
201 time_ust_dispatch_register_stop
);
202 fprintf(fp
, "Dispatch UST registration request time\n");
203 fprintf(fp
, "Time: %.20f sec.\n", res
);
207 fprintf(fp
, "--> Manage registration breakdown\n");
209 res
= get_bench_time(time_ust_register_read_start
,
210 time_ust_register_read_stop
);
211 fprintf(fp
, "read() from pipe time\n");
212 fprintf(fp
, "Time: %.20f sec.\n", res
);
216 res
= get_bench_time(time_ust_register_add_start
,
217 time_ust_register_add_stop
);
218 fprintf(fp
, "register_traceable_app time\n");
219 fprintf(fp
, "Time: %.20f sec.\n", res
);
223 res
= get_bench_time(time_ust_register_done_start
,
224 time_ust_register_done_stop
);
225 fprintf(fp
, "send register done command time\n");
226 fprintf(fp
, "Time: %.20f sec.\n", res
);
230 fprintf(fp
, "Global time of an UST application registration\n");
231 fprintf(fp
, "Time: %.20f sec.\n", total
);
235 fprintf(fp
, "NO DATA\n");
241 * Log results of the sessiond boot process.
243 * Uses all time_sessiond_* values (see measures.h)
245 void bench_print_boot_process(void)
248 double global_boot_time
= 0.0;
250 fprintf(fp
, "--- Session daemon boot process ---\n");
252 res
= get_bench_time(time_sessiond_boot_start
, time_sessiond_boot_end
);
254 fprintf(fp
, "Inside main() from start to first pthread_join"
255 "(blocking state)\n");
256 fprintf(fp
, "Time: %.20f sec.\n", res
);
258 global_boot_time
+= res
;
260 res
= get_bench_time(time_sessiond_th_kern_start
,
261 time_sessiond_th_kern_poll
);
263 fprintf(fp
, "Kernel thread from start to poll() (ready state)\n");
264 fprintf(fp
, "Time: %.20f sec.\n", res
);
266 global_boot_time
+= res
;
268 res
= get_bench_time(time_sessiond_th_apps_start
,
269 time_sessiond_th_apps_poll
);
271 fprintf(fp
, "Application thread from start to poll() (ready state)\n");
272 fprintf(fp
, "Time: %.20f sec.\n", res
);
274 global_boot_time
+= res
;
276 res
= get_bench_time(time_sessiond_th_cli_start
,
277 time_sessiond_th_cli_poll
);
279 fprintf(fp
, "Client thread from start to poll() (ready state)\n");
280 fprintf(fp
, "Time: %.20f sec.\n", res
);
282 global_boot_time
+= res
;
284 res
= get_bench_time(time_sessiond_th_dispatch_start
,
285 time_sessiond_th_dispatch_block
);
287 fprintf(fp
, "Dispatch registration thread from start to poll()"
289 fprintf(fp
, "Time: %.20f sec.\n", res
);
291 global_boot_time
+= res
;
293 fprintf(fp
, "Global Boot Time\n");
294 fprintf(fp
, "Time: %0.20f sec.\n", global_boot_time
);