You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:22