You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyQRCode/MyQrCode/Utils/LaunchPerformanceMonitor.swift

112 lines
3.8 KiB

import Foundation
import UIKit
// MARK: -
class LaunchPerformanceMonitor {
static let shared = LaunchPerformanceMonitor()
private var startTime: CFAbsoluteTime = 0
private var milestones: [String: CFAbsoluteTime] = [:]
private init() {}
// MARK: -
///
func startMonitoring() {
startTime = CFAbsoluteTimeGetCurrent()
milestones["app_launch_start"] = startTime
print("🚀 启动性能监控开始: \(startTime)")
}
///
func recordMilestone(_ name: String) {
let currentTime = CFAbsoluteTimeGetCurrent()
milestones[name] = currentTime
if let startTime = milestones["app_launch_start"] {
let elapsed = currentTime - startTime
print("📊 启动里程碑 [\(name)]: \(String(format: "%.3f", elapsed))s")
}
}
///
func finishMonitoring() {
let endTime = CFAbsoluteTimeGetCurrent()
milestones["app_launch_complete"] = endTime
if let startTime = milestones["app_launch_start"] {
let totalTime = endTime - startTime
print("✅ 启动完成,总耗时: \(String(format: "%.3f", totalTime))s")
//
analyzeLaunchPhases()
}
}
///
private func analyzeLaunchPhases() {
let sortedMilestones = milestones.sorted { $0.value < $1.value }
print("\n📈 启动阶段分析:")
for i in 0..<sortedMilestones.count - 1 {
let current = sortedMilestones[i]
let next = sortedMilestones[i + 1]
let duration = next.value - current.value
print("\(current.key)\(next.key): \(String(format: "%.3f", duration))s")
}
//
checkPerformanceIssues()
}
///
private func checkPerformanceIssues() {
let sortedMilestones = milestones.sorted { $0.value < $1.value }
for i in 0..<sortedMilestones.count - 1 {
let current = sortedMilestones[i]
let next = sortedMilestones[i + 1]
let duration = next.value - current.value
if duration > 0.5 { // 500ms
print("⚠️ 性能警告: \(current.key)\(next.key) 耗时 \(String(format: "%.3f", duration))s")
}
}
}
///
func getTotalLaunchTime() -> Double {
guard let startTime = milestones["app_launch_start"],
let endTime = milestones["app_launch_complete"] else {
return 0
}
return endTime - startTime
}
///
func getPhaseDuration(from startMilestone: String, to endMilestone: String) -> Double? {
guard let start = milestones[startMilestone],
let end = milestones[endMilestone] else {
return nil
}
return end - start
}
}
// MARK: -
extension LaunchPerformanceMonitor {
enum LaunchPhase: String, CaseIterable {
case appDidFinishLaunching = "app_did_finish_launching"
case coreDataInitialized = "core_data_initialized"
case languageManagerInitialized = "language_manager_initialized"
case memoryMonitorInitialized = "memory_monitor_initialized"
case facebookSDKInitialized = "facebook_sdk_initialized"
case vasKitInitialized = "vas_kit_initialized"
case contentViewAppeared = "content_view_appeared"
case launchScreenHidden = "launch_screen_hidden"
case appFullyReady = "app_fully_ready"
}
}