/* * Copyright (C) 2021 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. */ package com.example.testapp class TimingTracker( private val numberOfIterations: Int = 1, private var numberOfIterationsToIgnore: Int = 0 ) { init { require(numberOfIterations > numberOfIterationsToIgnore) } private val timings = mutableMapOf() private var currentIteration: Int = 0 fun nextIteration() { currentIteration++ } fun measure(name: String, workToTime: () -> T): T { val start = System.nanoTime() val t = workToTime() if (currentIteration >= numberOfIterationsToIgnore) { val end = System.nanoTime() val deltaInMicroseconds: Int = ((end - start) / 1000).toInt() val timing = timings.getOrPut(name) { IntArray(numberOfIterations - numberOfIterationsToIgnore) } timing[currentIteration - numberOfIterationsToIgnore] += deltaInMicroseconds } return t } fun report(): String { var minimum: Int = Int.MAX_VALUE for (timing in timings.values) { val m = timing.minOrNull() if (m != null && m < minimum) minimum = m } println(timings.map { (name, timing) -> name + ": " + timing.minOrNull() }.joinToString(separator = "\n")) return (timings.map { (name, timing) -> name + ": " + timing.joinToString() }.joinToString() + "\n\n" + timings.map { (name, timing) -> name + ": " + timing.joinToString { "%.2f".format(it.toFloat() / minimum) } }.joinToString() + "\n\n" + timings.map { (name, timing) -> name + ": " + timing.minOrNull() }.joinToString()) } }