【发布时间】:2016-09-04 08:53:43
【问题描述】:
我正在尝试查看为 iOS 版本 7-8-9 编译的应用程序在 Xcode 7 中执行方法需要多长时间。
看到这个问题,Getting the time elapsed (Objective-c)。答案警告不要依赖 NSDate 如此短暂的时间。取而代之的是this Answer 建议:
CFTimeInterval startTime = CACurrentMediaTime();
// perform some action
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
即使在导入#import <QuartzCore/QuartzCore.h> 之后,此代码也无法编译。报告链接器故障:
架构 armv7 的未定义符号:
“_CACurrentMediaTime”,引用自:
还有其他方法可以以毫秒或纳秒为单位跟踪短暂的时刻吗?
请不要警告使微基准测试不可靠的内在变幻莫测。我只是想对时间有一个粗略的概念。
也许 Objective-C 或 Swift 有类似于 JMH, Java Micro-benchmarking Harness 的东西,用于构建、运行和分析用 Java 和其他针对 Java Virtual Machine 的语言编写的 nano/micro/milli/macro 基准测试。
【问题讨论】:
-
我觉得xcode单元测试有性能测试的方法。不确定您是否可以以纳秒为单位查看时间。可能多次调用该方法然后除以总时间?
-
@Surely 谢谢,但我不是单元测试。我只想捕获开始和停止时间来计算单个方法顶部和底部附近的经过时间。
-
问题不只是缺乏精确性;乱序执行会使结果变得更糟,而不仅仅是嘈杂。例如结束时间可以在您尝试测量的代码的结果仍在等待缓存未命中时进行采样,或者甚至是在缓存中将全部丢失的短链相关负载。当然,这通常只是不需要系统调用的时间源的问题(如 x86 的 RDTSC 指令,并且不(单独)序列化乱序执行。)使系统调用序列化大多数 CPU 设计中的流水线。
标签: ios objective-c benchmarking microbenchmark