<!DOCTYPE html> <!-- Copyright 2015 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/mre/function_handle.html"> <link rel="import" href="/tracing/value/histogram.html"> <script> 'use strict'; tr.exportTo('pi.m', function() { var COUNT_BOUNDARIES = tr.v.HistogramBinBoundaries.createLinear(0, 5e4, 20); function traceStatsFunction(result, model) { var canonicalUrl = model.canonicalUrl; var eventCount = 0; var firstTime = Number.MAX_VALUE; var lastTime = 0; var categories = {}; var seconds_counts = {}; for (var event of model.getDescendantEvents()) { eventCount += 1; if (event.start < firstTime) firstTime = event.start; var eventEnd = event.start + event.duration; if (eventEnd > lastTime) lastTime = eventEnd; if (categories[event.category] === undefined) categories[event.category] = 0; categories[event.category]++; var second = Math.round(event.start / 1000); if (seconds_counts[second] === undefined) seconds_counts[second] = 0; seconds_counts[second]++; } var histogram = new tr.v.Histogram( tr.b.Unit.byName.count, COUNT_BOUNDARIES); for (var second in seconds_counts) histogram.add(seconds_counts[second]); var stats = { totalEvents: eventCount, firstTimeInMS: firstTime, lastTimeInMS: lastTime, durationInMS: lastTime - firstTime, eventsPerSecond: eventCount / (lastTime - firstTime) * 1000, categories: categories, events_seconds: histogram.asDict() }; result.addPair('stats', stats); } tr.mre.FunctionRegistry.register(traceStatsFunction); //Exporting for tests. return { traceStatsFunctionForTest: traceStatsFunction }; }); </script>