是否有一种方法可以确定一个方法需要执行多少时间(以毫秒为单位)?
当前回答
下面是我使用的两个单行宏:
#define TICK NSDate *startTime = [NSDate date]
#define TOCK NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
像这样使用它:
TICK;
/* ... Do Some Work Here ... */
TOCK;
其他回答
struct TIME {
static var ti = mach_timebase_info()
static var k: Double = 1
static var mach_stamp: Double {
if ti.denom == 0 {
mach_timebase_info(&ti)
k = Double(ti.numer) / Double(ti.denom) * 1e-6
}
return Double(mach_absolute_time()) * k
}
static var stamp: Double { return NSDate.timeIntervalSinceReferenceDate() * 1000 }
}
do {
let mach_start = TIME.mach_stamp
usleep(200000)
let mach_diff = TIME.mach_stamp - mach_start
let start = TIME.stamp
usleep(200000)
let diff = TIME.stamp - start
print(mach_diff, diff)
}
许多答案很奇怪,并没有真正以毫秒为单位给出结果(而是以秒或其他单位):
这里是我用来获得MS(毫秒):
迅速:
let startTime = NSDate().timeIntervalSince1970 * 1000
// your Swift code
let endTimeMinusStartTime = NSDate().timeIntervalSince1970 * 1000 - startTime
print("time code execution \(endTimeMinStartTime) ms")
objective - c:
double startTime = [[NSDate date] timeIntervalSince1970] * 1000.0;
// your Objective-C code
double endTimeMinusStartTime = [[NSDate date] timeIntervalSince1970] * 1000.0 - startTime;
printf("time code execution %f ms\n", endTimeMinusStartTime );
NSDate *methodStart = [NSDate date];
/* ... Do whatever you need to do ... */
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"executionTime = %f", executionTime);
迅速:
let methodStart = NSDate()
/* ... Do whatever you need to do ... */
let methodFinish = NSDate()
let executionTime = methodFinish.timeIntervalSinceDate(methodStart)
print("Execution time: \(executionTime)")
Swift3:
let methodStart = Date()
/* ... Do whatever you need to do ... */
let methodFinish = Date()
let executionTime = methodFinish.timeIntervalSince(methodStart)
print("Execution time: \(executionTime)")
易于使用,具有亚毫秒精度。
我用这个:
clock_t start, end;
double elapsed;
start = clock();
//Start code to time
//End code to time
end = clock();
elapsed = ((double) (end - start)) / CLOCKS_PER_SEC;
NSLog(@"Time: %f",elapsed);
但我不确定iPhone上的CLOCKS_PER_SEC。你还是别打了吧。
好吧,如果你的目标是找出你可以修复什么使它更快,那是一个有点不同的目标。测量函数所花费的时间是一种很好的方法,可以发现您所做的事情是否产生了影响,但要找出该做什么,您需要一种不同的技术。这就是我的建议,我知道你可以在iphone上这么做。
编辑:审稿人建议我详细说明答案,所以我想用一种简单的方式来解释。 你的整个程序需要足够的时钟时间来打扰你。假设这是N秒。 你假设你可以加速它。唯一的方法就是让它在这段时间内不做它正在做的事情,占m秒。 你一开始并不知道这个东西是什么。您可以像所有程序员一样猜测,但它很容易是其他东西。不管是什么,下面是找到它的方法:
因为那个东西,不管它是什么,占了m/N的时间,这意味着如果你随机暂停它,你在它做那件事的时候抓住它的概率是m/N。当然,它可能在做其他事情,但暂停它,看看它在做什么。 现在再做一次。如果你看到它再次做同样的事情,你就更可疑了。
做10次,或者20次。现在,如果你看到它在多次暂停中做一些特定的事情(不管你怎么描述它),你可以摆脱,你知道两件事。你大概知道需要花多少时间,但你很清楚要修复什么。 如果你还想知道能节省多少时间,那很简单。之前测量,修正,之后测量。如果你真的很失望,那就退出修复。
你知道这和测量有什么不同吗?这是发现,而不是测量。大多数分析都是基于尽可能精确地测量所花费的时间,就好像这很重要一样,并明确需要解决的问题。剖析并不能找到所有的问题,但是这种方法确实能找到所有的问题,而那些你没有找到的问题对你造成了伤害。
推荐文章
- 为什么Swift的编译时间这么慢?
- iPhone上UIView和UILabels的渐变
- keychain上的分发证书中缺少私钥
- 在实现API时,我如何避免在块中捕获自我?
- 如何创建一个Swift Date对象?
- Xcode 4在目标设备上说“finished running <my app>”——什么都没有发生
- 从另一个应用程序打开设置应用程序
- 快速提取正则表达式匹配
- 如何应用梯度的背景视图的iOS Swift应用程序
- 图书馆吗?静态的?动态吗?或框架?另一个项目中的项目
- 如何用SwiftUI调整图像大小?
- Xcode 6 gitignore文件应该包括什么?
- “每个程序员应该知道的关于内存的事情”有多少仍然是有效的?
- 如何在iPhone/iOS上删除电话号码的蓝色样式?
- 检测视网膜显示