Swift是否使用墙钟时间?有无Android SystemClock.elapsedRealTime等效方法?
问题解答
1. 能否用Date().timeIntervalSinceNow准确测量耗时?
不能。Date().timeIntervalSinceNow依赖系统的墙钟时间(即当前日期时间),这个时间会受用户手动修改、时区调整、网络时间同步等因素影响,出现不可预测的跳变。就像你测试的修改iPhone时区后秒表时间异常,正是因为它基于墙钟时间,无法反映代码执行的真实耗时。
2. Swift中等效于Android SystemClock.elapsedRealTime的方法
Swift中有两种常用方案,和SystemClock.elapsedRealTime行为一致(不受墙钟时间影响,记录系统启动后的总时长,包含休眠时间):
方案一:ProcessInfo.processInfo.systemUptime
这是最易用的API,返回系统启动到当前的秒数(带小数,支持毫秒级精度),使用示例:
let startTime = ProcessInfo.processInfo.systemUptime // 执行需要测量耗时的代码 let endTime = ProcessInfo.processInfo.systemUptime let elapsedTime = endTime - startTime print("耗时:\(elapsedTime)秒")
方案二:mach_absolute_time()(纳秒级精度)
如果需要更高精度的纳秒级测量,可以用这个底层API,它返回系统启动后的时钟周期数,需要通过mach_timebase_info转换为实际时间单位:
import Foundation import MachO func getAbsoluteTime() -> UInt64 { return mach_absolute_time() } func convertToNanoseconds(absoluteTime: UInt64) -> UInt64 { var info = mach_timebase_info_data_t() mach_timebase_info(&info) return absoluteTime * UInt64(info.numer) / UInt64(info.denom) } // 使用示例 let start = getAbsoluteTime() // 执行代码 let end = getAbsoluteTime() let elapsedNanos = convertToNanoseconds(absoluteTime: end - start) print("耗时:\(elapsedNanos)纳秒")
注:
mach_absolute_time()的时间基准是系统硬件时钟,不受系统时间修改影响,和SystemClock.elapsedRealtimeNanos()的特性完全匹配。
内容的提问来源于stack exchange,提问作者BPDev
相关产品推荐
相关产品推荐

