| // Copyright 2020 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {IcLogEntry} from './log/ic.mjs'; |
| |
| // For compatibility with console scripts: |
| print = console.log; |
| |
| export class Group { |
| constructor(property, key, entry) { |
| this.property = property; |
| this.key = key; |
| this.count = 1; |
| this.entries = [entry]; |
| this.percentage = undefined; |
| this.groups = undefined; |
| } |
| |
| add(entry) { |
| this.count++; |
| this.entries.push(entry) |
| } |
| |
| createSubGroups() { |
| // TODO: use Map |
| this.groups = {}; |
| for (const propertyName of IcLogEntry.propertyNames) { |
| if (this.property == propertyName) continue; |
| this.groups[propertyName] = Group.groupBy(this.entries, propertyName); |
| } |
| } |
| |
| static groupBy(entries, property) { |
| let accumulator = Object.create(null); |
| let length = entries.length; |
| for (let i = 0; i < length; i++) { |
| let entry = entries[i]; |
| let key = entry[property]; |
| if (accumulator[key] == undefined) { |
| accumulator[key] = new Group(property, key, entry); |
| } else { |
| let group = accumulator[key]; |
| if (group.entries == undefined) console.log([group, entry]); |
| group.add(entry) |
| } |
| } |
| let result = []; |
| for (let key in accumulator) { |
| let group = accumulator[key]; |
| group.percentage = Math.round(group.count / length * 100 * 100) / 100; |
| result.push(group); |
| } |
| result.sort((a, b) => {return b.count - a.count}); |
| return result; |
| } |
| } |