- 实现EPUB阅读器搜索功能及选中注释功能 - 优化CFI模块,修复代码审查发现的11个问题 - 实现大书远距目录跳转与后台补全优化方案 - 优化设置面板与章节运行时联动 - 重构及大量改进优化
65 lines
1.9 KiB
Swift
65 lines
1.9 KiB
Swift
import Foundation
|
|
|
|
public struct RDEPUBTextPerformanceSample: Equatable {
|
|
|
|
public var chapterHref: String
|
|
|
|
public var renderDuration: TimeInterval
|
|
|
|
public var paginateDuration: TimeInterval
|
|
|
|
public var pageCount: Int
|
|
|
|
public var attributedStringLength: Int
|
|
|
|
public var cacheHit: Bool
|
|
|
|
public init(
|
|
chapterHref: String,
|
|
renderDuration: TimeInterval,
|
|
paginateDuration: TimeInterval,
|
|
pageCount: Int,
|
|
attributedStringLength: Int,
|
|
cacheHit: Bool
|
|
) {
|
|
self.chapterHref = chapterHref
|
|
self.renderDuration = renderDuration
|
|
self.paginateDuration = paginateDuration
|
|
self.pageCount = pageCount
|
|
self.attributedStringLength = attributedStringLength
|
|
self.cacheHit = cacheHit
|
|
}
|
|
}
|
|
|
|
public final class RDEPUBTextPerformanceSampler {
|
|
|
|
public private(set) var samples: [RDEPUBTextPerformanceSample] = []
|
|
|
|
public var totalBuildDuration: TimeInterval = 0
|
|
|
|
public init() {}
|
|
|
|
public func record(_ sample: RDEPUBTextPerformanceSample) {
|
|
samples.append(sample)
|
|
#if DEBUG
|
|
print("[PERF] \(sample.chapterHref): render=\(formatMS(sample.renderDuration)) paginate=\(formatMS(sample.paginateDuration)) pages=\(sample.pageCount) cache=\(sample.cacheHit ? "HIT" : "MISS")")
|
|
#endif
|
|
}
|
|
|
|
public func summary() -> String {
|
|
let totalRender = samples.reduce(0) { $0 + $1.renderDuration }
|
|
let totalPaginate = samples.reduce(0) { $0 + $1.paginateDuration }
|
|
let hitCount = samples.filter(\.cacheHit).count
|
|
return "[PERF] chapters=\(samples.count) render=\(formatMS(totalRender)) paginate=\(formatMS(totalPaginate)) total=\(formatMS(totalBuildDuration)) cacheHits=\(hitCount)/\(samples.count)"
|
|
}
|
|
|
|
public func reset() {
|
|
samples.removeAll()
|
|
totalBuildDuration = 0
|
|
}
|
|
|
|
private func formatMS(_ duration: TimeInterval) -> String {
|
|
String(format: "%.0fms", duration * 1000)
|
|
}
|
|
}
|