| // Copyright (C) 2024 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| import m from 'mithril'; |
| |
| // The interface that every container (e.g. Track Panels) that exposes granular |
| // per-container masurements implements to be perf-stats-aware. |
| export interface PerfStatsContainer { |
| setPerfStatsEnabled(enable: boolean): void; |
| renderPerfStats(): m.Children; |
| } |
| |
| // Stores statistics about samples, and keeps a fixed size buffer of most recent |
| // samples. |
| export class PerfStats { |
| private _count = 0; |
| private _mean = 0; |
| private _lastValue = 0; |
| private _ptr = 0; |
| |
| private buffer: number[] = []; |
| |
| constructor(private _maxBufferSize = 10) {} |
| |
| addValue(value: number) { |
| this._lastValue = value; |
| if (this.buffer.length >= this._maxBufferSize) { |
| this.buffer[this._ptr++] = value; |
| if (this._ptr >= this.buffer.length) { |
| this._ptr -= this.buffer.length; |
| } |
| } else { |
| this.buffer.push(value); |
| } |
| |
| this._mean = (this._mean * this._count + value) / (this._count + 1); |
| this._count++; |
| } |
| |
| get mean() { |
| return this._mean; |
| } |
| get count() { |
| return this._count; |
| } |
| get bufferMean() { |
| return this.buffer.reduce((sum, v) => sum + v, 0) / this.buffer.length; |
| } |
| get bufferSize() { |
| return this.buffer.length; |
| } |
| get maxBufferSize() { |
| return this._maxBufferSize; |
| } |
| get last() { |
| return this._lastValue; |
| } |
| } |
| |
| // Returns a summary string representation of a RunningStatistics object. |
| export function runningStatStr(stat: PerfStats) { |
| return ( |
| `Last: ${stat.last.toFixed(2)}ms | ` + |
| `Avg: ${stat.mean.toFixed(2)}ms | ` + |
| `Avg${stat.maxBufferSize}: ${stat.bufferMean.toFixed(2)}ms` |
| ); |
| } |