AppDelegate定时器启动过慢及TSV与Realm数据加载速度对比测试需求
实现TSV与Realm加载速度对比的计时方案
刚好做过类似的性能对比需求,我来帮你完善实现思路和代码:
首先,你的TimerSpeedCounter类可以优化得更精准,毕竟Timer的触发间隔可能有误差,直接计算时间差比累加计数器靠谱得多。这里给你补全并优化后的版本:
class TimerSpeedCounter { private var timer: Timer? private var startTime: Date? // 直接存储已流逝的时间,精度更高 var elapsedTime: TimeInterval = 0 // 启动计时,立即开始 func start() { reset() startTime = Date() // 用0.01秒的间隔更新,兼顾精度和性能 timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { [weak self] _ in guard let self = self, let start = self.startTime else { return } self.elapsedTime = Date().timeIntervalSince(start) } // 强制触发一次,避免初始延迟 timer?.fire() } // 停止计时 func stop() { timer?.invalidate() timer = nil startTime = nil print("当前任务耗时:\(String(format: "%.3f", elapsedTime))秒") } // 重置计时状态 func reset() { stop() elapsedTime = 0 } }
接下来在AppDelegate里尽快启动计时,并且在数据加载完成后停止:
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? // 提前初始化计数器,确保启动时可用 private let speedCounter = TimerSpeedCounter() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 这里是App启动后最早的可执行代码点之一,直接启动计时 speedCounter.start() // 先测试TSV加载 loadTSVData { [weak self] in guard let self = self else { return } self.speedCounter.stop() let tsvCost = self.speedCounter.elapsedTime // 重置计数器,开始测试Realm self.speedCounter.reset() self.speedCounter.start() self.loadRealmData { [weak self] in self?.speedCounter.stop() let realmCost = self?.speedCounter.elapsedTime ?? 0 // 输出对比结果 print("=== 加载速度对比 ===") print("TSV加载耗时:\(String(format: "%.3f", tsvCost))秒") print("Realm加载耗时:\(String(format: "%.3f", realmCost))秒") } } return true } // 替换成你实际的TSV加载逻辑 private func loadTSVData(completion: @escaping () -> Void) { // 建议在后台线程执行加载,避免阻塞主线程 DispatchQueue.global(qos: .userInitiated).async { // 这里写TSV文件读取、解析、加载到内存的代码 // 模拟耗时操作,实际替换成你的逻辑 Thread.sleep(forTimeInterval: 1.1) DispatchQueue.main.async { completion() } } } // 替换成你实际的Realm加载逻辑 private func loadRealmData(completion: @escaping () -> Void) { DispatchQueue.global(qos: .userInitiated).async { // 这里写Realm数据查询、加载到内存的代码 // 模拟耗时操作,实际替换成你的逻辑 Thread.sleep(forTimeInterval: 0.4) DispatchQueue.main.async { completion() } } } }
额外优化建议
如果你的需求只是单次加载的总耗时对比,其实不需要一直运行Timer,用系统级的时间戳会更精准(避免Timer受RunLoop影响的延迟),比如直接用CFAbsoluteTimeGetCurrent():
// 示例:用时间戳直接计算TSV加载耗时 private func loadTSVData() { let startTime = CFAbsoluteTimeGetCurrent() // 执行TSV加载逻辑... let endTime = CFAbsoluteTimeGetCurrent() let cost = endTime - startTime print("TSV加载耗时:\(String(format: "%.3f", cost))秒") }
这种方式精度更高,代码也更简洁,适合单纯的性能对比场景。
内容的提问来源于stack exchange,提问作者lithium
相关产品推荐
相关产品推荐

