小测试
测试下分别使用NSLog和printf打印10000次耗费的时间。CFAbsoluteTimeGetCurrent()函数可以打印出当前的时间戳,精度还是很高的,于是乎测试代码如下:
- CFAbsoluteTime startNSLog = CFAbsoluteTimeGetCurrent();
- for (int i = 0; i < 10000; i++) {
- NSLog(@"%d", i);
- }
- CFAbsoluteTime endNSLog = CFAbsoluteTimeGetCurrent();
- CFAbsoluteTime startPrintf = CFAbsoluteTimeGetCurrent();
- for (int i = 0; i < 10000; i++) {
- printf("%d\n", i);
- }
- CFAbsoluteTime endPrintf = CFAbsoluteTimeGetCurrent();
- NSLog(@"NSLog time: %lf, printf time: %lf", endNSLog - startNSLog, endPrintf - startPrintf);
这个时间和机器肯定有关系,只看它们的差别就好。为了全面性,尝试了三种平台:
- NSLog time: 4.985445, printf time: 0.084193 // mac
- NSLog time: 5.562460, printf time: 0.019408 // 模拟器
- NSLog time: 10.471490, printf time: 0.090503 // 真机调试(iphone5)
可以发现,在mac上(模拟器其实也算是mac吧)速度差别达到了60倍左右,而真机调试甚至达到了离谱的100多倍。
探究原因
基本上这种事情一定可以在Apple文档中找到,看NSLog的文档,第一句话就说:Logs an error message to the Apple System Log facility.,所以首先,NSLog就不是设计作为普通的debug log的,而是error log;其次,NSLog也并非是printf的简单封装,而是Apple System Log(后面简称ASL)的封装。