| <!DOCTYPE html> |
| <!-- |
| Copyright 2016 The Chromium Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| |
| <link rel="import" href="/tracing/base/range.html"> |
| <link rel="import" href="/tracing/base/unit.html"> |
| <link rel="import" href="/tracing/metrics/metric_registry.html"> |
| <link rel="import" href="/tracing/value/histogram.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.exportTo('tr.metrics.v8', function() { |
| var CUSTOM_BOUNDARIES = tr.v.HistogramBinBoundaries.createLinear(4, 200, 100); |
| |
| function computeExecuteMetrics(values, model) { |
| var cpuTotalExecution = new tr.v.Histogram('v8_execution_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalExecution.description = 'cpu total time spent in script execution'; |
| var wallTotalExecution = new tr.v.Histogram('v8_execution_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalExecution.description = |
| 'wall total time spent in script execution'; |
| var cpuSelfExecution = new tr.v.Histogram('v8_execution_cpu_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuSelfExecution.description = 'cpu self time spent in script execution'; |
| var wallSelfExecution = new tr.v.Histogram('v8_execution_wall_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallSelfExecution.description = 'wall self time spent in script execution'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.Execute')) { |
| cpuTotalExecution.addSample(e.cpuDuration); |
| wallTotalExecution.addSample(e.duration); |
| cpuSelfExecution.addSample(e.cpuSelfTime); |
| wallSelfExecution.addSample(e.selfTime); |
| } |
| |
| values.addHistogram(cpuTotalExecution); |
| values.addHistogram(wallTotalExecution); |
| values.addHistogram(cpuSelfExecution); |
| values.addHistogram(wallSelfExecution); |
| } |
| |
| function computeParseLazyMetrics(values, model) { |
| var cpuSelfParseLazy = new tr.v.Histogram('v8_parse_lazy_cpu_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuSelfParseLazy.description = |
| 'cpu self time spent performing lazy parsing'; |
| var wallSelfParseLazy = new tr.v.Histogram('v8_parse_lazy_wall_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallSelfParseLazy.description = |
| 'wall self time spent performing lazy parsing'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.ParseLazyMicroSeconds')) { |
| cpuSelfParseLazy.addSample(e.cpuSelfTime); |
| wallSelfParseLazy.addSample(e.selfTime); |
| } |
| for (var e of model.findTopmostSlicesNamed('V8.ParseLazy')) { |
| cpuSelfParseLazy.addSample(e.cpuSelfTime); |
| wallSelfParseLazy.addSample(e.selfTime); |
| } |
| |
| values.addHistogram(cpuSelfParseLazy); |
| values.addHistogram(wallSelfParseLazy); |
| } |
| |
| function computeCompileFullCodeMetrics(values, model) { |
| var cpuSelfCompileFullCode = new tr.v.Histogram( |
| 'v8_compile_full_code_cpu_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuSelfCompileFullCode.description = |
| 'cpu self time spent performing compiling full code'; |
| var wallSelfCompileFullCode = new tr.v.Histogram( |
| 'v8_compile_full_code_wall_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallSelfCompileFullCode.description = |
| 'wall self time spent performing compiling full code'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.CompileFullCode')) { |
| cpuSelfCompileFullCode.addSample(e.cpuSelfTime); |
| wallSelfCompileFullCode.addSample(e.selfTime); |
| } |
| |
| values.addHistogram(cpuSelfCompileFullCode); |
| values.addHistogram(wallSelfCompileFullCode); |
| } |
| |
| function computeCompileIgnitionMetrics(values, model) { |
| var cpuSelfCompileIgnition = new tr.v.Histogram( |
| 'v8_compile_ignition_cpu_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuSelfCompileIgnition.description = |
| 'cpu self time spent in compile ignition'; |
| var wallSelfCompileIgnition = new tr.v.Histogram( |
| 'v8_compile_ignition_wall_self', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallSelfCompileIgnition.description = |
| 'wall self time spent in compile ignition'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.CompileIgnition')) { |
| cpuSelfCompileIgnition.addSample(e.cpuSelfTime); |
| wallSelfCompileIgnition.addSample(e.selfTime); |
| } |
| |
| values.addHistogram(cpuSelfCompileIgnition); |
| values.addHistogram(wallSelfCompileIgnition); |
| } |
| |
| function computeRecompileMetrics(values, model) { |
| var cpuTotalRecompileSynchronous = new tr.v.Histogram( |
| 'v8_recompile_synchronous_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalRecompileSynchronous.description = |
| 'cpu total time spent in synchronous recompilation'; |
| var wallTotalRecompileSynchronous = new tr.v.Histogram( |
| 'v8_recompile_synchronous_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalRecompileSynchronous.description = |
| 'wall total time spent in synchronous recompilation'; |
| var cpuTotalRecompileConcurrent = new tr.v.Histogram( |
| 'v8_recompile_concurrent_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalRecompileConcurrent.description = |
| 'cpu total time spent in concurrent recompilation'; |
| var wallTotalRecompileConcurrent = new tr.v.Histogram( |
| 'v8_recompile_concurrent_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalRecompileConcurrent.description = |
| 'wall total time spent in concurrent recompilation'; |
| // TODO(eakuefner): Stop computing overall values once dash v2 is ready. |
| // https://github.com/catapult-project/catapult/issues/2180 |
| var cpuTotalRecompileOverall = new tr.v.Histogram( |
| 'v8_recompile_overall_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalRecompileOverall.description = |
| 'cpu total time spent in synchronous or concurrent recompilation'; |
| var wallTotalRecompileOverall = new tr.v.Histogram( |
| 'v8_recompile_overall_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalRecompileOverall.description = |
| 'wall total time spent in synchronous or concurrent recompilation'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.RecompileSynchronous')) { |
| cpuTotalRecompileSynchronous.addSample(e.cpuDuration); |
| wallTotalRecompileSynchronous.addSample(e.duration); |
| cpuTotalRecompileOverall.addSample(e.cpuDuration); |
| wallTotalRecompileOverall.addSample(e.duration); |
| } |
| |
| values.addHistogram(cpuTotalRecompileSynchronous); |
| values.addHistogram(wallTotalRecompileSynchronous); |
| |
| for (var e of model.findTopmostSlicesNamed('V8.RecompileConcurrent')) { |
| cpuTotalRecompileConcurrent.addSample(e.cpuDuration); |
| wallTotalRecompileConcurrent.addSample(e.duration); |
| cpuTotalRecompileOverall.addSample(e.cpuDuration); |
| wallTotalRecompileOverall.addSample(e.duration); |
| } |
| |
| values.addHistogram(cpuTotalRecompileConcurrent); |
| values.addHistogram(wallTotalRecompileConcurrent); |
| values.addHistogram(cpuTotalRecompileOverall); |
| values.addHistogram(wallTotalRecompileOverall); |
| } |
| |
| function computeOptimizeCodeMetrics(values, model) { |
| var cpuTotalOptimizeCode = new tr.v.Histogram('v8_optimize_code_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalOptimizeCode.description = |
| 'cpu total time spent in code optimization'; |
| var wallTotalOptimizeCode = new tr.v.Histogram( |
| 'v8_optimize_code_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalOptimizeCode.description = |
| 'wall total time spent in code optimization'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.OptimizeCode')) { |
| cpuTotalOptimizeCode.addSample(e.cpuDuration); |
| wallTotalOptimizeCode.addSample(e.duration); |
| } |
| |
| values.addHistogram(cpuTotalOptimizeCode); |
| values.addHistogram(wallTotalOptimizeCode); |
| } |
| |
| function computeDeoptimizeCodeMetrics(values, model) { |
| var cpuTotalDeoptimizeCode = new tr.v.Histogram( |
| 'v8_deoptimize_code_cpu_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| cpuTotalDeoptimizeCode.description = |
| 'cpu total time spent in code deoptimization'; |
| var wallTotalDeoptimizeCode = new tr.v.Histogram( |
| 'v8_deoptimize_code_wall_total', |
| tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, CUSTOM_BOUNDARIES); |
| wallTotalDeoptimizeCode.description = |
| 'wall total time spent in code deoptimization'; |
| |
| for (var e of model.findTopmostSlicesNamed('V8.DeoptimizeCode')) { |
| cpuTotalDeoptimizeCode.addSample(e.cpuDuration); |
| wallTotalDeoptimizeCode.addSample(e.duration); |
| } |
| |
| values.addHistogram(cpuTotalDeoptimizeCode); |
| values.addHistogram(wallTotalDeoptimizeCode); |
| } |
| |
| function executionMetric(values, model) { |
| computeExecuteMetrics(values, model); |
| computeParseLazyMetrics(values, model); |
| computeCompileIgnitionMetrics(values, model); |
| computeCompileFullCodeMetrics(values, model); |
| computeRecompileMetrics(values, model); |
| computeOptimizeCodeMetrics(values, model); |
| computeDeoptimizeCodeMetrics(values, model); |
| } |
| |
| tr.metrics.MetricRegistry.register(executionMetric); |
| |
| return { |
| executionMetric: executionMetric |
| }; |
| }); |
| </script> |