GCD 之 dispatch_benchmark 测量指定代码块执行时间

基准测试

在 GCD 的一个不起眼的角落,你会发现一个适合优化代码的灵巧小工具:

uint64_t dispatch_benchmark(size_t count, void (^block)(void));

把这个声明放到你的代码中,你就能够测量给定的代码执行的平均的纳秒数。例子如下:

size_t const objectCount = 1000;
uint64_t n = dispatch_benchmark(10000, ^{
    @autoreleasepool {
        id obj = @42;
        NSMutableArray *array = [NSMutableArray array];
        for (size_t i = 0; i < objectCount; ++i) {
            [array addObject:obj];
        }
    }
});
NSLog(@"-[NSMutableArray addObject:] : %llu ns", n);

在我的机器上输出了:

-[NSMutableArray addObject:] : 31803 ns

也就是说添加1000个对象到 NSMutableArray 总共消耗了31803纳秒,或者说平均一个对象消耗32纳秒。

正如 dispatch_benchmark 的帮助页面指出的,测量性能并非如看起来那样不重要。尤其是当比较并发代码和非并发代码时,你需要注意特定硬件上运行的特定计算带宽和内存带宽。不同的机器会很不一样。如果代码的性能与访问临界区有关,那么我们上面提到的锁竞争问题就会有所影响。

你可能感兴趣的:(代码优化,gcd,代码块时间测量,消耗时间)