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