OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_COUNTERS_H_ | 5 #ifndef V8_COUNTERS_H_ |
6 #define V8_COUNTERS_H_ | 6 #define V8_COUNTERS_H_ |
7 | 7 |
8 #include "include/v8.h" | 8 #include "include/v8.h" |
9 #include "src/allocation.h" | 9 #include "src/allocation.h" |
10 #include "src/base/atomic-utils.h" | 10 #include "src/base/atomic-utils.h" |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
241 void* CreateHistogram() const; | 241 void* CreateHistogram() const; |
242 | 242 |
243 const char* name_; | 243 const char* name_; |
244 int min_; | 244 int min_; |
245 int max_; | 245 int max_; |
246 int num_buckets_; | 246 int num_buckets_; |
247 void* histogram_; | 247 void* histogram_; |
248 Counters* counters_; | 248 Counters* counters_; |
249 }; | 249 }; |
250 | 250 |
251 // A HistogramTimer allows distributions of results to be created. | 251 enum class HistogramTimerResolution { MILLISECOND, MICROSECOND }; |
252 class HistogramTimer : public Histogram { | 252 |
253 // A thread safe histogram timer, allowing distributions of | |
254 // (non-nested) timed results. | |
Mircea Trofin
2017/06/22 18:42:24
why is non-nested in brackets?
kschimpf
2017/06/22 20:38:31
Removing parenthesis and fixing to say nested. Thi
| |
255 class TimedHistogram : public Histogram { | |
253 public: | 256 public: |
254 enum Resolution { | 257 // Start the timer. Log if isolate non-null. |
255 MILLISECOND, | 258 void Start(base::ElapsedTimer* timer, Isolate* isolate); |
256 MICROSECOND | |
257 }; | |
258 | 259 |
259 // Note: public for testing purposes only. | 260 // Stop the timer and record the results. Log if isolate non-null. |
260 HistogramTimer(const char* name, int min, int max, Resolution resolution, | 261 void Stop(base::ElapsedTimer* timer, Isolate* isolate); |
261 int num_buckets, Counters* counters) | 262 |
263 protected: | |
264 friend class Counters; | |
265 HistogramTimerResolution resolution_; | |
266 | |
267 TimedHistogram() {} | |
268 TimedHistogram(const char* name, int min, int max, | |
269 HistogramTimerResolution resolution, int num_buckets, | |
270 Counters* counters) | |
262 : Histogram(name, min, max, num_buckets, counters), | 271 : Histogram(name, min, max, num_buckets, counters), |
263 resolution_(resolution) {} | 272 resolution_(resolution) {} |
273 void AddTimeSample(); | |
274 }; | |
264 | 275 |
265 // Start the timer. | 276 // Helper class for scoping a TimedHistogram. |
266 void Start(); | 277 class TimedHistogramScope { |
278 public: | |
279 explicit TimedHistogramScope(TimedHistogram* histogram, | |
280 Isolate* isolate = nullptr) | |
281 : histogram_(histogram), isolate_(isolate) { | |
282 histogram_->Start(&timer_, isolate); | |
283 } | |
284 ~TimedHistogramScope() { histogram_->Stop(&timer_, isolate_); } | |
267 | 285 |
268 // Stop the timer and record the results. | 286 private: |
269 void Stop(); | 287 base::ElapsedTimer timer_; |
288 TimedHistogram* histogram_; | |
289 Isolate* isolate_; | |
290 | |
291 DISALLOW_IMPLICIT_CONSTRUCTORS(TimedHistogramScope); | |
292 }; | |
293 | |
294 // A HistogramTimer allows distributions of (non-nested) timed results | |
Mircea Trofin
2017/06/22 18:42:23
non-nested in brackets
kschimpf
2017/06/22 20:38:31
Done.
| |
295 // to be created. WARNING: This class is not thread safe and can only | |
296 // be run on the foreground thread. | |
297 class HistogramTimer : public TimedHistogram { | |
Mircea Trofin
2017/06/22 18:42:23
Is the difference between the two their thread saf
kschimpf
2017/06/22 20:38:31
The base class is the more general solution, as it
| |
298 public: | |
299 // Note: public for testing purposes only. | |
300 HistogramTimer(const char* name, int min, int max, | |
301 HistogramTimerResolution resolution, int num_buckets, | |
302 Counters* counters) | |
303 : TimedHistogram(name, min, max, resolution, num_buckets, counters) {} | |
304 | |
305 inline void Start(); | |
306 inline void Stop(); | |
270 | 307 |
271 // Returns true if the timer is running. | 308 // Returns true if the timer is running. |
272 bool Running() { | 309 bool Running() { |
273 return Enabled() && timer_.IsStarted(); | 310 return Enabled() && timer_.IsStarted(); |
274 } | 311 } |
275 | 312 |
276 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. | 313 // TODO(bmeurer): Remove this when HistogramTimerScope is fixed. |
277 #ifdef DEBUG | 314 #ifdef DEBUG |
278 base::ElapsedTimer* timer() { return &timer_; } | 315 base::ElapsedTimer* timer() { return &timer_; } |
279 #endif | 316 #endif |
280 | 317 |
281 private: | 318 private: |
282 friend class Counters; | 319 friend class Counters; |
283 | 320 |
284 base::ElapsedTimer timer_; | 321 base::ElapsedTimer timer_; |
285 Resolution resolution_; | |
286 | 322 |
287 HistogramTimer() {} | 323 HistogramTimer() {} |
288 }; | 324 }; |
289 | 325 |
290 // Helper class for scoping a HistogramTimer. | 326 // Helper class for scoping a HistogramTimer. |
291 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the | 327 // TODO(bmeurer): The ifdeffery is an ugly hack around the fact that the |
292 // Parser is currently reentrant (when it throws an error, we call back | 328 // Parser is currently reentrant (when it throws an error, we call back |
293 // into JavaScript and all bets are off), but ElapsedTimer is not | 329 // into JavaScript and all bets are off), but ElapsedTimer is not |
294 // reentry-safe. Fix this properly and remove |allow_nesting|. | 330 // reentry-safe. Fix this properly and remove |allow_nesting|. |
295 class HistogramTimerScope BASE_EMBEDDED { | 331 class HistogramTimerScope BASE_EMBEDDED { |
(...skipping 24 matching lines...) Expand all Loading... | |
320 #endif | 356 #endif |
321 } | 357 } |
322 | 358 |
323 private: | 359 private: |
324 HistogramTimer* timer_; | 360 HistogramTimer* timer_; |
325 #ifdef DEBUG | 361 #ifdef DEBUG |
326 bool skipped_timer_start_; | 362 bool skipped_timer_start_; |
327 #endif | 363 #endif |
328 }; | 364 }; |
329 | 365 |
330 | |
331 // A histogram timer that can aggregate events within a larger scope. | 366 // A histogram timer that can aggregate events within a larger scope. |
332 // | 367 // |
333 // Intended use of this timer is to have an outer (aggregating) and an inner | 368 // Intended use of this timer is to have an outer (aggregating) and an inner |
334 // (to be aggregated) scope, where the inner scope measure the time of events, | 369 // (to be aggregated) scope, where the inner scope measure the time of events, |
335 // and all those inner scope measurements will be summed up by the outer scope. | 370 // and all those inner scope measurements will be summed up by the outer scope. |
336 // An example use might be to aggregate the time spent in lazy compilation | 371 // An example use might be to aggregate the time spent in lazy compilation |
337 // while running a script. | 372 // while running a script. |
338 // | 373 // |
339 // Helpers: | 374 // Helpers: |
340 // - AggregatingHistogramTimerScope, the "outer" scope within which | 375 // - AggregatingHistogramTimerScope, the "outer" scope within which |
(...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1000 MICROSECOND) \ | 1035 MICROSECOND) \ |
1001 /* Total compilation time incl. caching/parsing */ \ | 1036 /* Total compilation time incl. caching/parsing */ \ |
1002 HT(compile_script, V8.CompileScriptMicroSeconds, 1000000, MICROSECOND) \ | 1037 HT(compile_script, V8.CompileScriptMicroSeconds, 1000000, MICROSECOND) \ |
1003 /* Total JavaScript execution time (including callbacks and runtime calls */ \ | 1038 /* Total JavaScript execution time (including callbacks and runtime calls */ \ |
1004 HT(execute, V8.Execute, 1000000, MICROSECOND) \ | 1039 HT(execute, V8.Execute, 1000000, MICROSECOND) \ |
1005 /* Asm/Wasm */ \ | 1040 /* Asm/Wasm */ \ |
1006 HT(wasm_instantiate_asm_module_time, \ | 1041 HT(wasm_instantiate_asm_module_time, \ |
1007 V8.WasmInstantiateModuleMicroSeconds.asm, 10000000, MICROSECOND) \ | 1042 V8.WasmInstantiateModuleMicroSeconds.asm, 10000000, MICROSECOND) \ |
1008 HT(wasm_instantiate_wasm_module_time, \ | 1043 HT(wasm_instantiate_wasm_module_time, \ |
1009 V8.WasmInstantiateModuleMicroSeconds.wasm, 10000000, MICROSECOND) \ | 1044 V8.WasmInstantiateModuleMicroSeconds.wasm, 10000000, MICROSECOND) \ |
1010 HT(wasm_decode_asm_module_time, V8.WasmDecodeModuleMicroSeconds.asm, \ | |
1011 1000000, MICROSECOND) \ | |
1012 HT(wasm_decode_wasm_module_time, V8.WasmDecodeModuleMicroSeconds.wasm, \ | |
1013 1000000, MICROSECOND) \ | |
1014 HT(wasm_decode_asm_function_time, V8.WasmDecodeFunctionMicroSeconds.asm, \ | |
1015 1000000, MICROSECOND) \ | |
1016 HT(wasm_decode_wasm_function_time, V8.WasmDecodeFunctionMicroSeconds.wasm, \ | |
1017 1000000, MICROSECOND) \ | |
1018 HT(wasm_compile_asm_module_time, V8.WasmCompileModuleMicroSeconds.asm, \ | |
1019 10000000, MICROSECOND) \ | |
1020 HT(wasm_compile_wasm_module_time, V8.WasmCompileModuleMicroSeconds.wasm, \ | |
1021 10000000, MICROSECOND) \ | |
1022 HT(wasm_compile_function_time, V8.WasmCompileFunctionMicroSeconds, 1000000, \ | 1045 HT(wasm_compile_function_time, V8.WasmCompileFunctionMicroSeconds, 1000000, \ |
1023 MICROSECOND) \ | 1046 MICROSECOND) \ |
1024 HT(asm_wasm_translation_time, V8.AsmWasmTranslationMicroSeconds, 1000000, \ | 1047 HT(asm_wasm_translation_time, V8.AsmWasmTranslationMicroSeconds, 1000000, \ |
1025 MICROSECOND) \ | 1048 MICROSECOND) \ |
1026 HT(wasm_lazy_compilation_time, V8.WasmLazyCompilationMicroSeconds, 1000000, \ | 1049 HT(wasm_lazy_compilation_time, V8.WasmLazyCompilationMicroSeconds, 1000000, \ |
1027 MICROSECOND) | 1050 MICROSECOND) |
1028 | 1051 |
1052 #define TIMED_HISTOGRAM_LIST(HT) \ | |
1053 HT(wasm_decode_asm_module_time, V8.WasmDecodeModuleMicroSeconds.asm, \ | |
1054 1000000, MICROSECOND) \ | |
1055 HT(wasm_decode_wasm_module_time, V8.WasmDecodeModuleMicroSeconds.wasm, \ | |
1056 1000000, MICROSECOND) \ | |
1057 HT(wasm_decode_asm_function_time, V8.WasmDecodeFunctionMicroSeconds.asm, \ | |
1058 1000000, MICROSECOND) \ | |
1059 HT(wasm_decode_wasm_function_time, V8.WasmDecodeFunctionMicroSeconds.wasm, \ | |
1060 1000000, MICROSECOND) \ | |
1061 HT(wasm_compile_asm_module_time, V8.WasmCompileModuleMicroSeconds.asm, \ | |
1062 10000000, MICROSECOND) \ | |
1063 HT(wasm_compile_wasm_module_time, V8.WasmCompileModuleMicroSeconds.wasm, \ | |
1064 10000000, MICROSECOND) | |
1065 | |
1029 #define AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) \ | 1066 #define AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) \ |
1030 AHT(compile_lazy, V8.CompileLazyMicroSeconds) | 1067 AHT(compile_lazy, V8.CompileLazyMicroSeconds) |
1031 | 1068 |
1032 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ | 1069 #define HISTOGRAM_PERCENTAGE_LIST(HP) \ |
1033 /* Heap fragmentation. */ \ | 1070 /* Heap fragmentation. */ \ |
1034 HP(external_fragmentation_total, V8.MemoryExternalFragmentationTotal) \ | 1071 HP(external_fragmentation_total, V8.MemoryExternalFragmentationTotal) \ |
1035 HP(external_fragmentation_old_space, V8.MemoryExternalFragmentationOldSpace) \ | 1072 HP(external_fragmentation_old_space, V8.MemoryExternalFragmentationOldSpace) \ |
1036 HP(external_fragmentation_code_space, \ | 1073 HP(external_fragmentation_code_space, \ |
1037 V8.MemoryExternalFragmentationCodeSpace) \ | 1074 V8.MemoryExternalFragmentationCodeSpace) \ |
1038 HP(external_fragmentation_map_space, V8.MemoryExternalFragmentationMapSpace) \ | 1075 HP(external_fragmentation_map_space, V8.MemoryExternalFragmentationMapSpace) \ |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1229 #define HR(name, caption, min, max, num_buckets) \ | 1266 #define HR(name, caption, min, max, num_buckets) \ |
1230 Histogram* name() { return &name##_; } | 1267 Histogram* name() { return &name##_; } |
1231 HISTOGRAM_RANGE_LIST(HR) | 1268 HISTOGRAM_RANGE_LIST(HR) |
1232 #undef HR | 1269 #undef HR |
1233 | 1270 |
1234 #define HT(name, caption, max, res) \ | 1271 #define HT(name, caption, max, res) \ |
1235 HistogramTimer* name() { return &name##_; } | 1272 HistogramTimer* name() { return &name##_; } |
1236 HISTOGRAM_TIMER_LIST(HT) | 1273 HISTOGRAM_TIMER_LIST(HT) |
1237 #undef HT | 1274 #undef HT |
1238 | 1275 |
1276 #define HT(name, caption, max, res) \ | |
1277 TimedHistogram* name() { return &name##_; } | |
1278 TIMED_HISTOGRAM_LIST(HT) | |
1279 #undef HT | |
1280 | |
1239 #define AHT(name, caption) \ | 1281 #define AHT(name, caption) \ |
1240 AggregatableHistogramTimer* name() { return &name##_; } | 1282 AggregatableHistogramTimer* name() { return &name##_; } |
1241 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) | 1283 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) |
1242 #undef AHT | 1284 #undef AHT |
1243 | 1285 |
1244 #define HP(name, caption) \ | 1286 #define HP(name, caption) \ |
1245 Histogram* name() { return &name##_; } | 1287 Histogram* name() { return &name##_; } |
1246 HISTOGRAM_PERCENTAGE_LIST(HP) | 1288 HISTOGRAM_PERCENTAGE_LIST(HP) |
1247 #undef HP | 1289 #undef HP |
1248 | 1290 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1297 { return &count_of_CODE_AGE_##name##_; } \ | 1339 { return &count_of_CODE_AGE_##name##_; } \ |
1298 StatsCounter* size_of_CODE_AGE_##name() \ | 1340 StatsCounter* size_of_CODE_AGE_##name() \ |
1299 { return &size_of_CODE_AGE_##name##_; } | 1341 { return &size_of_CODE_AGE_##name##_; } |
1300 CODE_AGE_LIST_COMPLETE(SC) | 1342 CODE_AGE_LIST_COMPLETE(SC) |
1301 #undef SC | 1343 #undef SC |
1302 | 1344 |
1303 // clang-format off | 1345 // clang-format off |
1304 enum Id { | 1346 enum Id { |
1305 #define RATE_ID(name, caption, max, res) k_##name, | 1347 #define RATE_ID(name, caption, max, res) k_##name, |
1306 HISTOGRAM_TIMER_LIST(RATE_ID) | 1348 HISTOGRAM_TIMER_LIST(RATE_ID) |
1349 TIMED_HISTOGRAM_LIST(RATE_ID) | |
1307 #undef RATE_ID | 1350 #undef RATE_ID |
1308 #define AGGREGATABLE_ID(name, caption) k_##name, | 1351 #define AGGREGATABLE_ID(name, caption) k_##name, |
1309 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AGGREGATABLE_ID) | 1352 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AGGREGATABLE_ID) |
1310 #undef AGGREGATABLE_ID | 1353 #undef AGGREGATABLE_ID |
1311 #define PERCENTAGE_ID(name, caption) k_##name, | 1354 #define PERCENTAGE_ID(name, caption) k_##name, |
1312 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) | 1355 HISTOGRAM_PERCENTAGE_LIST(PERCENTAGE_ID) |
1313 #undef PERCENTAGE_ID | 1356 #undef PERCENTAGE_ID |
1314 #define MEMORY_ID(name, caption) k_##name, | 1357 #define MEMORY_ID(name, caption) k_##name, |
1315 HISTOGRAM_LEGACY_MEMORY_LIST(MEMORY_ID) | 1358 HISTOGRAM_LEGACY_MEMORY_LIST(MEMORY_ID) |
1316 HISTOGRAM_MEMORY_LIST(MEMORY_ID) | 1359 HISTOGRAM_MEMORY_LIST(MEMORY_ID) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1365 Isolate* isolate() { return isolate_; } | 1408 Isolate* isolate() { return isolate_; } |
1366 | 1409 |
1367 #define HR(name, caption, min, max, num_buckets) Histogram name##_; | 1410 #define HR(name, caption, min, max, num_buckets) Histogram name##_; |
1368 HISTOGRAM_RANGE_LIST(HR) | 1411 HISTOGRAM_RANGE_LIST(HR) |
1369 #undef HR | 1412 #undef HR |
1370 | 1413 |
1371 #define HT(name, caption, max, res) HistogramTimer name##_; | 1414 #define HT(name, caption, max, res) HistogramTimer name##_; |
1372 HISTOGRAM_TIMER_LIST(HT) | 1415 HISTOGRAM_TIMER_LIST(HT) |
1373 #undef HT | 1416 #undef HT |
1374 | 1417 |
1418 #define HT(name, caption, max, res) TimedHistogram name##_; | |
1419 TIMED_HISTOGRAM_LIST(HT) | |
1420 #undef HT | |
1421 | |
1375 #define AHT(name, caption) \ | 1422 #define AHT(name, caption) \ |
1376 AggregatableHistogramTimer name##_; | 1423 AggregatableHistogramTimer name##_; |
1377 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) | 1424 AGGREGATABLE_HISTOGRAM_TIMER_LIST(AHT) |
1378 #undef AHT | 1425 #undef AHT |
1379 | 1426 |
1380 #define HP(name, caption) \ | 1427 #define HP(name, caption) \ |
1381 Histogram name##_; | 1428 Histogram name##_; |
1382 HISTOGRAM_PERCENTAGE_LIST(HP) | 1429 HISTOGRAM_PERCENTAGE_LIST(HP) |
1383 #undef HP | 1430 #undef HP |
1384 | 1431 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1425 StatsCounter size_of_CODE_AGE_##name##_; \ | 1472 StatsCounter size_of_CODE_AGE_##name##_; \ |
1426 StatsCounter count_of_CODE_AGE_##name##_; | 1473 StatsCounter count_of_CODE_AGE_##name##_; |
1427 CODE_AGE_LIST_COMPLETE(SC) | 1474 CODE_AGE_LIST_COMPLETE(SC) |
1428 #undef SC | 1475 #undef SC |
1429 | 1476 |
1430 RuntimeCallStats runtime_call_stats_; | 1477 RuntimeCallStats runtime_call_stats_; |
1431 | 1478 |
1432 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); | 1479 DISALLOW_IMPLICIT_CONSTRUCTORS(Counters); |
1433 }; | 1480 }; |
1434 | 1481 |
1482 void HistogramTimer::Start() { | |
1483 TimedHistogram::Start(&timer_, counters()->isolate()); | |
1484 } | |
1485 | |
1486 void HistogramTimer::Stop() { | |
1487 TimedHistogram::Stop(&timer_, counters()->isolate()); | |
1488 } | |
1489 | |
1435 } // namespace internal | 1490 } // namespace internal |
1436 } // namespace v8 | 1491 } // namespace v8 |
1437 | 1492 |
1438 #endif // V8_COUNTERS_H_ | 1493 #endif // V8_COUNTERS_H_ |
OLD | NEW |