f9dbb6921c
* fix: Fix divison by zero in Performance Sample collector * use `isEmpty`
68 lines
1.6 KiB
Swift
68 lines
1.6 KiB
Swift
//
|
|
// FrameProcessorPerformanceDataCollector.swift
|
|
// VisionCamera
|
|
//
|
|
// Created by Marc Rousavy on 30.08.21.
|
|
// Copyright © 2021 mrousavy. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
// keep a maximum of `maxSampleSize` historical performance data samples cached.
|
|
private let maxSampleSize = 15
|
|
|
|
// MARK: - PerformanceSampleCollection
|
|
|
|
struct PerformanceSampleCollection {
|
|
var endPerformanceSampleCollection: () -> Void
|
|
|
|
init(end: @escaping () -> Void) {
|
|
endPerformanceSampleCollection = end
|
|
}
|
|
}
|
|
|
|
// MARK: - FrameProcessorPerformanceDataCollector
|
|
|
|
class FrameProcessorPerformanceDataCollector {
|
|
private var performanceSamples: [Double] = []
|
|
private var counter = 0
|
|
private var lastEvaluation = -1
|
|
|
|
var hasEnoughData: Bool {
|
|
return !performanceSamples.isEmpty
|
|
}
|
|
|
|
var averageExecutionTimeSeconds: Double {
|
|
let sum = performanceSamples.reduce(0, +)
|
|
let average = sum / Double(performanceSamples.count)
|
|
|
|
lastEvaluation = counter
|
|
|
|
return average
|
|
}
|
|
|
|
func beginPerformanceSampleCollection() -> PerformanceSampleCollection {
|
|
let begin = DispatchTime.now()
|
|
|
|
return PerformanceSampleCollection {
|
|
let end = DispatchTime.now()
|
|
let seconds = Double(end.uptimeNanoseconds - begin.uptimeNanoseconds) / 1_000_000_000.0
|
|
|
|
let index = self.counter % maxSampleSize
|
|
|
|
if self.performanceSamples.count > index {
|
|
self.performanceSamples[index] = seconds
|
|
} else {
|
|
self.performanceSamples.append(seconds)
|
|
}
|
|
|
|
self.counter += 1
|
|
}
|
|
}
|
|
|
|
func clear() {
|
|
counter = 0
|
|
performanceSamples.removeAll()
|
|
}
|
|
}
|