| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/test/perf/perf_test.h" | |
| 6 | |
| 7 #include <stdio.h> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "base/process/process.h" | |
| 11 #include "base/strings/string_number_conversions.h" | |
| 12 #include "base/strings/stringprintf.h" | |
| 13 #include "chrome/test/base/chrome_process_util.h" | |
| 14 #include "testing/perf/perf_test.h" | |
| 15 | |
| 16 namespace perf_test { | |
| 17 | |
| 18 void PrintIOPerfInfo(const std::string& test_name, | |
| 19 const ChromeProcessList& chrome_processes, | |
| 20 base::ProcessId browser_pid) { | |
| 21 PrintIOPerfInfo(stdout, test_name, chrome_processes, browser_pid); | |
| 22 } | |
| 23 | |
| 24 void PrintIOPerfInfo(FILE* target, | |
| 25 const std::string& test_name, | |
| 26 const ChromeProcessList& chrome_processes, | |
| 27 base::ProcessId browser_pid) { | |
| 28 fprintf(target, "%s", IOPerfInfoToString(test_name, chrome_processes, | |
| 29 browser_pid).c_str()); | |
| 30 } | |
| 31 | |
| 32 std::string IOPerfInfoToString(const std::string& test_name, | |
| 33 const ChromeProcessList& chrome_processes, | |
| 34 base::ProcessId browser_pid) { | |
| 35 size_t read_op_b = 0; | |
| 36 size_t read_op_r = 0; | |
| 37 size_t write_op_b = 0; | |
| 38 size_t write_op_r = 0; | |
| 39 size_t other_op_b = 0; | |
| 40 size_t other_op_r = 0; | |
| 41 size_t total_op_b = 0; | |
| 42 size_t total_op_r = 0; | |
| 43 | |
| 44 size_t read_byte_b = 0; | |
| 45 size_t read_byte_r = 0; | |
| 46 size_t write_byte_b = 0; | |
| 47 size_t write_byte_r = 0; | |
| 48 size_t other_byte_b = 0; | |
| 49 size_t other_byte_r = 0; | |
| 50 size_t total_byte_b = 0; | |
| 51 size_t total_byte_r = 0; | |
| 52 | |
| 53 std::string output; | |
| 54 ChromeProcessList::const_iterator it; | |
| 55 for (it = chrome_processes.begin(); it != chrome_processes.end(); ++it) { | |
| 56 base::Process process = base::Process::Open(*it); | |
| 57 if (!process.IsValid()) { | |
| 58 NOTREACHED(); | |
| 59 return output; | |
| 60 } | |
| 61 | |
| 62 // TODO(sgk): if/when base::ProcessMetrics returns real stats on mac: | |
| 63 // scoped_ptr<base::ProcessMetrics> process_metrics( | |
| 64 // base::ProcessMetrics::CreateProcessMetrics(process.Handle())); | |
| 65 scoped_ptr<ChromeTestProcessMetrics> process_metrics( | |
| 66 ChromeTestProcessMetrics::CreateProcessMetrics(process.Handle())); | |
| 67 base::IoCounters io_counters; | |
| 68 memset(&io_counters, 0, sizeof(io_counters)); | |
| 69 | |
| 70 if (process_metrics.get()->GetIOCounters(&io_counters)) { | |
| 71 // Print out IO performance. We assume that the values can be | |
| 72 // converted to size_t (they're reported as ULONGLONG, 64-bit numbers). | |
| 73 std::string chrome_name = (*it == browser_pid) ? "_b" : "_r"; | |
| 74 | |
| 75 size_t read_op = static_cast<size_t>(io_counters.ReadOperationCount); | |
| 76 size_t write_op = static_cast<size_t>(io_counters.WriteOperationCount); | |
| 77 size_t other_op = static_cast<size_t>(io_counters.OtherOperationCount); | |
| 78 size_t total_op = static_cast<size_t>(io_counters.ReadOperationCount + | |
| 79 io_counters.WriteOperationCount + | |
| 80 io_counters.OtherOperationCount); | |
| 81 | |
| 82 size_t read_byte = static_cast<size_t>(io_counters.ReadTransferCount | |
| 83 / 1024); | |
| 84 size_t write_byte = static_cast<size_t>(io_counters.WriteTransferCount | |
| 85 / 1024); | |
| 86 size_t other_byte = static_cast<size_t>(io_counters.OtherTransferCount | |
| 87 / 1024); | |
| 88 size_t total_byte = static_cast<size_t>((io_counters.ReadTransferCount + | |
| 89 io_counters.WriteTransferCount + | |
| 90 io_counters.OtherTransferCount) | |
| 91 / 1024); | |
| 92 | |
| 93 if (*it == browser_pid) { | |
| 94 read_op_b = read_op; | |
| 95 write_op_b = write_op; | |
| 96 other_op_b = other_op; | |
| 97 total_op_b = total_op; | |
| 98 read_byte_b = read_byte; | |
| 99 write_byte_b = write_byte; | |
| 100 other_byte_b = other_byte; | |
| 101 total_byte_b = total_byte; | |
| 102 } else { | |
| 103 read_op_r += read_op; | |
| 104 write_op_r += write_op; | |
| 105 other_op_r += other_op; | |
| 106 total_op_r += total_op; | |
| 107 read_byte_r += read_byte; | |
| 108 write_byte_r += write_byte; | |
| 109 other_byte_r += other_byte; | |
| 110 total_byte_r += total_byte; | |
| 111 } | |
| 112 } | |
| 113 } | |
| 114 | |
| 115 std::string t_name(test_name); | |
| 116 AppendResult(output, | |
| 117 "read_op_b", | |
| 118 std::string(), | |
| 119 "r_op_b" + t_name, | |
| 120 read_op_b, | |
| 121 "ops", | |
| 122 false); | |
| 123 AppendResult(output, | |
| 124 "write_op_b", | |
| 125 std::string(), | |
| 126 "w_op_b" + t_name, | |
| 127 write_op_b, | |
| 128 "ops", | |
| 129 false); | |
| 130 AppendResult(output, | |
| 131 "other_op_b", | |
| 132 std::string(), | |
| 133 "o_op_b" + t_name, | |
| 134 other_op_b, | |
| 135 "ops", | |
| 136 false); | |
| 137 AppendResult(output, | |
| 138 "total_op_b", | |
| 139 std::string(), | |
| 140 "IO_op_b" + t_name, | |
| 141 total_op_b, | |
| 142 "ops", | |
| 143 false); | |
| 144 | |
| 145 AppendResult(output, | |
| 146 "read_byte_b", | |
| 147 std::string(), | |
| 148 "r_b" + t_name, | |
| 149 read_byte_b, | |
| 150 "kb", | |
| 151 false); | |
| 152 AppendResult(output, | |
| 153 "write_byte_b", | |
| 154 std::string(), | |
| 155 "w_b" + t_name, | |
| 156 write_byte_b, | |
| 157 "kb", | |
| 158 false); | |
| 159 AppendResult(output, | |
| 160 "other_byte_b", | |
| 161 std::string(), | |
| 162 "o_b" + t_name, | |
| 163 other_byte_b, | |
| 164 "kb", | |
| 165 false); | |
| 166 AppendResult(output, | |
| 167 "total_byte_b", | |
| 168 std::string(), | |
| 169 "IO_b" + t_name, | |
| 170 total_byte_b, | |
| 171 "kb", | |
| 172 false); | |
| 173 | |
| 174 AppendResult(output, | |
| 175 "read_op_r", | |
| 176 std::string(), | |
| 177 "r_op_r" + t_name, | |
| 178 read_op_r, | |
| 179 "ops", | |
| 180 false); | |
| 181 AppendResult(output, | |
| 182 "write_op_r", | |
| 183 std::string(), | |
| 184 "w_op_r" + t_name, | |
| 185 write_op_r, | |
| 186 "ops", | |
| 187 false); | |
| 188 AppendResult(output, | |
| 189 "other_op_r", | |
| 190 std::string(), | |
| 191 "o_op_r" + t_name, | |
| 192 other_op_r, | |
| 193 "ops", | |
| 194 false); | |
| 195 AppendResult(output, | |
| 196 "total_op_r", | |
| 197 std::string(), | |
| 198 "IO_op_r" + t_name, | |
| 199 total_op_r, | |
| 200 "ops", | |
| 201 false); | |
| 202 | |
| 203 AppendResult(output, | |
| 204 "read_byte_r", | |
| 205 std::string(), | |
| 206 "r_r" + t_name, | |
| 207 read_byte_r, | |
| 208 "kb", | |
| 209 false); | |
| 210 AppendResult(output, | |
| 211 "write_byte_r", | |
| 212 std::string(), | |
| 213 "w_r" + t_name, | |
| 214 write_byte_r, | |
| 215 "kb", | |
| 216 false); | |
| 217 AppendResult(output, | |
| 218 "other_byte_r", | |
| 219 std::string(), | |
| 220 "o_r" + t_name, | |
| 221 other_byte_r, | |
| 222 "kb", | |
| 223 false); | |
| 224 AppendResult(output, | |
| 225 "total_byte_r", | |
| 226 std::string(), | |
| 227 "IO_r" + t_name, | |
| 228 total_byte_r, | |
| 229 "kb", | |
| 230 false); | |
| 231 | |
| 232 return output; | |
| 233 } | |
| 234 | |
| 235 void PrintMemoryUsageInfo(const std::string& test_name, | |
| 236 const ChromeProcessList& chrome_processes, | |
| 237 base::ProcessId browser_pid) { | |
| 238 PrintMemoryUsageInfo(stdout, test_name, chrome_processes, browser_pid); | |
| 239 } | |
| 240 | |
| 241 void PrintMemoryUsageInfo(FILE* target, | |
| 242 const std::string& test_name, | |
| 243 const ChromeProcessList& chrome_processes, | |
| 244 base::ProcessId browser_pid) { | |
| 245 fprintf(target, "%s", MemoryUsageInfoToString(test_name, chrome_processes, | |
| 246 browser_pid).c_str()); | |
| 247 } | |
| 248 | |
| 249 std::string MemoryUsageInfoToString(const std::string& test_name, | |
| 250 const ChromeProcessList& chrome_processes, | |
| 251 base::ProcessId browser_pid) { | |
| 252 size_t browser_virtual_size = 0; | |
| 253 size_t browser_working_set_size = 0; | |
| 254 size_t renderer_virtual_size = 0; | |
| 255 size_t renderer_working_set_size = 0; | |
| 256 size_t total_virtual_size = 0; | |
| 257 size_t total_working_set_size = 0; | |
| 258 #if defined(OS_WIN) | |
| 259 size_t browser_peak_virtual_size = 0; | |
| 260 size_t browser_peak_working_set_size = 0; | |
| 261 size_t renderer_total_peak_virtual_size = 0; | |
| 262 size_t renderer_total_peak_working_set_size = 0; | |
| 263 size_t renderer_single_peak_virtual_size = 0; | |
| 264 size_t renderer_single_peak_working_set_size = 0; | |
| 265 #endif | |
| 266 | |
| 267 std::string output; | |
| 268 ChromeProcessList::const_iterator it; | |
| 269 for (it = chrome_processes.begin(); it != chrome_processes.end(); ++it) { | |
| 270 base::Process process = base::Process::Open(*it); | |
| 271 if (!process.IsValid()) { | |
| 272 NOTREACHED(); | |
| 273 return output; | |
| 274 } | |
| 275 | |
| 276 // TODO(sgk): if/when base::ProcessMetrics returns real stats on mac: | |
| 277 // scoped_ptr<base::ProcessMetrics> process_metrics( | |
| 278 // base::ProcessMetrics::CreateProcessMetrics(process.Handle())); | |
| 279 scoped_ptr<ChromeTestProcessMetrics> process_metrics( | |
| 280 ChromeTestProcessMetrics::CreateProcessMetrics(process.Handle())); | |
| 281 | |
| 282 size_t current_virtual_size = process_metrics->GetPagefileUsage(); | |
| 283 size_t current_working_set_size = process_metrics->GetWorkingSetSize(); | |
| 284 | |
| 285 if (*it == browser_pid) { | |
| 286 browser_virtual_size = current_virtual_size; | |
| 287 browser_working_set_size = current_working_set_size; | |
| 288 } else { | |
| 289 renderer_virtual_size += current_virtual_size; | |
| 290 renderer_working_set_size += current_working_set_size; | |
| 291 } | |
| 292 total_virtual_size += current_virtual_size; | |
| 293 total_working_set_size += current_working_set_size; | |
| 294 | |
| 295 #if defined(OS_WIN) | |
| 296 size_t peak_virtual_size = process_metrics->GetPeakPagefileUsage(); | |
| 297 size_t peak_working_set_size = process_metrics->GetPeakWorkingSetSize(); | |
| 298 if (*it == browser_pid) { | |
| 299 browser_peak_virtual_size = peak_virtual_size; | |
| 300 browser_peak_working_set_size = peak_working_set_size; | |
| 301 } else { | |
| 302 if (peak_virtual_size > renderer_single_peak_virtual_size) { | |
| 303 renderer_single_peak_virtual_size = peak_virtual_size; | |
| 304 } | |
| 305 if (peak_working_set_size > renderer_single_peak_working_set_size) { | |
| 306 renderer_single_peak_working_set_size = peak_working_set_size; | |
| 307 } | |
| 308 renderer_total_peak_virtual_size += peak_virtual_size; | |
| 309 renderer_total_peak_working_set_size += peak_working_set_size; | |
| 310 } | |
| 311 #endif | |
| 312 } | |
| 313 | |
| 314 std::string trace_name(test_name); | |
| 315 #if defined(OS_WIN) | |
| 316 AppendResult(output, "vm_peak_b", "", "vm_pk_b" + trace_name, | |
| 317 browser_peak_virtual_size, "bytes", | |
| 318 false /* not important */); | |
| 319 AppendResult(output, "ws_peak_b", "", "ws_pk_b" + trace_name, | |
| 320 browser_peak_working_set_size, "bytes", | |
| 321 false /* not important */); | |
| 322 AppendResult(output, "vm_peak_r", "", "vm_pk_r" + trace_name, | |
| 323 renderer_total_peak_virtual_size, "bytes", | |
| 324 false /* not important */); | |
| 325 AppendResult(output, "ws_peak_r", "", "ws_pk_r" + trace_name, | |
| 326 renderer_total_peak_working_set_size, "bytes", | |
| 327 false /* not important */); | |
| 328 AppendResult(output, "vm_single_peak_r", "", "vm_spk_r" + trace_name, | |
| 329 renderer_single_peak_virtual_size, "bytes", | |
| 330 false /* not important */); | |
| 331 AppendResult(output, "ws_single_peak_r", "", "ws_spk_r" + trace_name, | |
| 332 renderer_single_peak_working_set_size, "bytes", | |
| 333 false /* important */); | |
| 334 AppendResult(output, "vm_final_b", "", "vm_f_b" + trace_name, | |
| 335 browser_virtual_size, "bytes", | |
| 336 false /* not important */); | |
| 337 AppendResult(output, "ws_final_b", "", "ws_f_b" + trace_name, | |
| 338 browser_working_set_size, "bytes", | |
| 339 false /* not important */); | |
| 340 AppendResult(output, "vm_final_r", "", "vm_f_r" + trace_name, | |
| 341 renderer_virtual_size, "bytes", | |
| 342 false /* not important */); | |
| 343 AppendResult(output, "ws_final_r", "", "ws_f_r" + trace_name, | |
| 344 renderer_working_set_size, "bytes", | |
| 345 false /* not important */); | |
| 346 AppendResult(output, "vm_final_t", "", "vm_f_t" + trace_name, | |
| 347 total_virtual_size, "bytes", | |
| 348 false /* not important */); | |
| 349 AppendResult(output, "ws_final_t", "", "ws_f_t" + trace_name, | |
| 350 total_working_set_size, "bytes", | |
| 351 false /* not important */); | |
| 352 #elif defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_ANDROID) | |
| 353 AppendResult(output, | |
| 354 "vm_size_final_b", | |
| 355 std::string(), | |
| 356 "vm_size_f_b" + trace_name, | |
| 357 browser_virtual_size, | |
| 358 "bytes", | |
| 359 false /* not important */); | |
| 360 AppendResult(output, | |
| 361 "vm_rss_final_b", | |
| 362 std::string(), | |
| 363 "vm_rss_f_b" + trace_name, | |
| 364 browser_working_set_size, | |
| 365 "bytes", | |
| 366 false /* not important */); | |
| 367 AppendResult(output, | |
| 368 "vm_size_final_r", | |
| 369 std::string(), | |
| 370 "vm_size_f_r" + trace_name, | |
| 371 renderer_virtual_size, | |
| 372 "bytes", | |
| 373 false /* not important */); | |
| 374 AppendResult(output, | |
| 375 "vm_rss_final_r", | |
| 376 std::string(), | |
| 377 "vm_rss_f_r" + trace_name, | |
| 378 renderer_working_set_size, | |
| 379 "bytes", | |
| 380 false /* not important */); | |
| 381 AppendResult(output, | |
| 382 "vm_size_final_t", | |
| 383 std::string(), | |
| 384 "vm_size_f_t" + trace_name, | |
| 385 total_virtual_size, | |
| 386 "bytes", | |
| 387 false /* not important */); | |
| 388 AppendResult(output, | |
| 389 "vm_rss_final_t", | |
| 390 std::string(), | |
| 391 "vm_rss_f_t" + trace_name, | |
| 392 total_working_set_size, | |
| 393 "bytes", | |
| 394 false /* not important */); | |
| 395 #else | |
| 396 NOTIMPLEMENTED(); | |
| 397 #endif | |
| 398 AppendResult(output, | |
| 399 "processes", | |
| 400 std::string(), | |
| 401 "proc_" + trace_name, | |
| 402 chrome_processes.size(), | |
| 403 "count", | |
| 404 false /* not important */); | |
| 405 | |
| 406 return output; | |
| 407 } | |
| 408 | |
| 409 } // namespace perf_test | |
| OLD | NEW |