是否有一种方法可以确定一个方法需要执行多少时间(以毫秒为单位)?
当前回答
我知道这是一个旧的,但即使我发现自己又一次徘徊在它旁边,所以我想在这里提交我自己的选择。
最好的办法是看看我的博客文章: 在Objective-C中计时:秒表
基本上,我写了一个类,它以非常基本的方式停止观看,但被封装,所以你只需要做以下事情:
[MMStopwatchARC start:@"My Timer"];
// your work here ...
[MMStopwatchARC stop:@"My Timer"];
最后你会得到:
MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029]
在日志里…
再一次,看看我的帖子,或者在这里下载: MMStopwatch.zip
其他回答
好吧,如果你的目标是找出你可以修复什么使它更快,那是一个有点不同的目标。测量函数所花费的时间是一种很好的方法,可以发现您所做的事情是否产生了影响,但要找出该做什么,您需要一种不同的技术。这就是我的建议,我知道你可以在iphone上这么做。
编辑:审稿人建议我详细说明答案,所以我想用一种简单的方式来解释。 你的整个程序需要足够的时钟时间来打扰你。假设这是N秒。 你假设你可以加速它。唯一的方法就是让它在这段时间内不做它正在做的事情,占m秒。 你一开始并不知道这个东西是什么。您可以像所有程序员一样猜测,但它很容易是其他东西。不管是什么,下面是找到它的方法:
因为那个东西,不管它是什么,占了m/N的时间,这意味着如果你随机暂停它,你在它做那件事的时候抓住它的概率是m/N。当然,它可能在做其他事情,但暂停它,看看它在做什么。 现在再做一次。如果你看到它再次做同样的事情,你就更可疑了。
做10次,或者20次。现在,如果你看到它在多次暂停中做一些特定的事情(不管你怎么描述它),你可以摆脱,你知道两件事。你大概知道需要花多少时间,但你很清楚要修复什么。 如果你还想知道能节省多少时间,那很简单。之前测量,修正,之后测量。如果你真的很失望,那就退出修复。
你知道这和测量有什么不同吗?这是发现,而不是测量。大多数分析都是基于尽可能精确地测量所花费的时间,就好像这很重要一样,并明确需要解决的问题。剖析并不能找到所有的问题,但是这种方法确实能找到所有的问题,而那些你没有找到的问题对你造成了伤害。
下面是我使用的两个单行宏:
#define TICK NSDate *startTime = [NSDate date]
#define TOCK NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
像这样使用它:
TICK;
/* ... Do Some Work Here ... */
TOCK;
我使用这个代码:
#import <mach/mach_time.h>
float TIME_BLOCK(NSString *key, void (^block)(void)) {
mach_timebase_info_data_t info;
if (mach_timebase_info(&info) != KERN_SUCCESS)
{
return -1.0;
}
uint64_t start = mach_absolute_time();
block();
uint64_t end = mach_absolute_time();
uint64_t elapsed = end - start;
uint64_t nanos = elapsed * info.numer / info.denom;
float cost = (float)nanos / NSEC_PER_SEC;
NSLog(@"key: %@ (%f ms)\n", key, cost * 1000);
return cost;
}
我知道这是一个旧的,但即使我发现自己又一次徘徊在它旁边,所以我想在这里提交我自己的选择。
最好的办法是看看我的博客文章: 在Objective-C中计时:秒表
基本上,我写了一个类,它以非常基本的方式停止观看,但被封装,所以你只需要做以下事情:
[MMStopwatchARC start:@"My Timer"];
// your work here ...
[MMStopwatchARC stop:@"My Timer"];
最后你会得到:
MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029]
在日志里…
再一次,看看我的帖子,或者在这里下载: MMStopwatch.zip
我使用非常少的,一页的类实现,灵感来自这篇博客文章的代码:
#import <mach/mach_time.h>
@interface DBGStopwatch : NSObject
+ (void)start:(NSString *)name;
+ (void)stop:(NSString *)name;
@end
@implementation DBGStopwatch
+ (NSMutableDictionary *)watches {
static NSMutableDictionary *Watches = nil;
static dispatch_once_t OnceToken;
dispatch_once(&OnceToken, ^{
Watches = @{}.mutableCopy;
});
return Watches;
}
+ (double)secondsFromMachTime:(uint64_t)time {
mach_timebase_info_data_t timebase;
mach_timebase_info(&timebase);
return (double)time * (double)timebase.numer /
(double)timebase.denom / 1e9;
}
+ (void)start:(NSString *)name {
uint64_t begin = mach_absolute_time();
self.watches[name] = @(begin);
}
+ (void)stop:(NSString *)name {
uint64_t end = mach_absolute_time();
uint64_t begin = [self.watches[name] unsignedLongLongValue];
DDLogInfo(@"Time taken for %@ %g s",
name, [self secondsFromMachTime:(end - begin)]);
[self.watches removeObjectForKey:name];
}
@end
它的用法很简单:
调用[DBGStopwatch start:@"slow-operation"];一开始 然后[DBGStopwatch stop:@"slow-operation"];做完之后,才能得到时间
推荐文章
- 如何删除默认的导航栏空间在SwiftUI导航视图
- 如何在iOS中使用Swift编程segue
- Swift -整数转换为小时/分钟/秒
- Swift:声明一个空字典
- 为什么ARC仍然需要@autoreleasepool ?
- 检测浏览器标签是否有焦点
- 在成功提交我的应用程序后,“太多符号文件”
- 首先添加一个UIView,甚至是导航栏
- 就性能而言,使用std::memcpy()还是std::copy()更好?
- 我如何改变UIButton标题颜色?
- 在Swift中如何调用GCD主线程上的参数方法?
- NSLayoutConstraints是可动画的吗?
- iOS -构建失败,CocoaPods无法找到头文件
- Xcode 4挂在“附加到(应用程序名称)”
- CFNetwork SSLHandshake iOS 9失败