mirror of
https://github.com/tsolomko/SWCompression.git
synced 2026-06-23 14:56:41 +00:00
76 lines
2.2 KiB
Swift
76 lines
2.2 KiB
Swift
// Copyright (c) 2021 Timofey Solomko
|
|
// Licensed under MIT License
|
|
//
|
|
// See LICENSE for license information
|
|
|
|
import Foundation
|
|
import SWCompression
|
|
import SwiftCLI
|
|
|
|
#if os(Linux)
|
|
import CoreFoundation
|
|
#endif
|
|
|
|
protocol BenchmarkCommand: Command {
|
|
|
|
var files: CollectedParameter { get }
|
|
|
|
var benchmarkName: String { get }
|
|
|
|
var benchmarkFunction: (Data) throws -> Any { get }
|
|
|
|
}
|
|
|
|
extension BenchmarkCommand {
|
|
|
|
func execute() throws {
|
|
let title = "\(benchmarkName) Benchmark\n"
|
|
print(String(repeating: "=", count: title.count))
|
|
print(title)
|
|
|
|
for file in self.files.value {
|
|
print("File: \(file)")
|
|
|
|
let inputURL = URL(fileURLWithPath: file)
|
|
let fileData = try Data(contentsOf: inputURL, options: .mappedIfSafe)
|
|
|
|
var totalTime: Double = 0
|
|
|
|
var maxTime = Double(Int.min)
|
|
var minTime = Double(Int.max)
|
|
|
|
print("Iterations: ", terminator: "")
|
|
#if !os(Linux)
|
|
fflush(__stdoutp)
|
|
#endif
|
|
// Zeroth (excluded) iteration.
|
|
let startTime = CFAbsoluteTimeGetCurrent()
|
|
_ = try benchmarkFunction(fileData)
|
|
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
|
|
print(String(format: "(%.3f) ", timeElapsed), terminator: "")
|
|
#if !os(Linux)
|
|
fflush(__stdoutp)
|
|
#endif
|
|
|
|
for _ in 1...10 {
|
|
let startTime = CFAbsoluteTimeGetCurrent()
|
|
_ = try benchmarkFunction(fileData)
|
|
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
|
|
print(String(format: "%.3f ", timeElapsed), terminator: "")
|
|
#if !os(Linux)
|
|
fflush(__stdoutp)
|
|
#endif
|
|
totalTime += timeElapsed
|
|
if timeElapsed > maxTime {
|
|
maxTime = timeElapsed
|
|
}
|
|
if timeElapsed < minTime {
|
|
minTime = timeElapsed
|
|
}
|
|
}
|
|
print(String(format: "\nAverage: %.3f \u{B1} %.3f\n", totalTime / 10, (maxTime - minTime) / 2))
|
|
}
|
|
}
|
|
|
|
}
|