我的应用程序包中有一个 XML。我正在解析这个 XML 文件。NSXMLParser
我使用和使用以下方式解析了这个 XML :
- 在主线程上串行运行整个代码
使用调度队列(GCD):
2.1 使用dispatch_queue_create创建我自己的调度队列
2.2 使用具有高优先级的全局队列dispatch_get_global_queue
2.3 使用低优先级的全局队列
2.4 使用具有后台优先级的全局队列
使用
NSOperationQueue
我检查了执行解析 XML 文件的性能和总时间,发现结果非常奇怪(或者可能是正确的)。
以下是上述解析方式的代码:
主线程上的串行执行 - 执行时间34 毫秒。
BOOL success = [conf parseXMLFile:[[NSBundle mainBundle] pathForResource:@"Configuration" ofType:@"xml"] didFailWithError:&error]; if (success) { DLog(@"Parsing Complete"); } else DLog(@"Parse error %@",[error description]);
2.1 使用dispatch_queue_create - 执行时间68 毫秒。
dispatch_queue_t backgroundQueue = dispatch_queue_create("BackQueue", NULL);
dispatch_async(backgroundQueue, ^{
NSError *error = nil;
BOOL success = [conf parseXMLFile:[[NSBundle mainBundle] pathForResource:@"Configuration" ofType:@"xml"] didFailWithError:&error];
if (success) {
DLog(@"Parsing Complete");
}
else
DLog(@"Parse error %@",[error description]);
});
dispatch_release(backgroundQueue);
2.2 使用具有高优先级dispatch_get_global_queue的全局队列- 执行时间 - 74 毫秒
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(backgroundQueue, ^{
NSError *error = nil;
BOOL success = [conf parseXMLFile:[[NSBundle mainBundle] pathForResource:@"Configuration" ofType:@"xml"] didFailWithError:&error];
if (success) {
DLog(@"Parsing Complete");
}
else
DLog(@"Parse error %@",[error description]);
});
dispatch_release(backgroundQueue);
2.3 类似于 2.2 使用具有 LOW 优先级的全局队列DISPATCH_QUEUE_PRIORITY_LOW - 执行时间 - 72 毫秒
2.4 与 2.2 使用具有背景优先级的全局队列DISPATCH_QUEUE_PRIORITY_BACKGROUND - 执行时间 - 37 毫秒
2.5. 使用NSOperationQueue
(继承 NSOperation) - 执行时间 - 36 毫秒
谁能帮我弄清楚这些执行时间以及为什么它们如此奇怪(或者我错过了什么)。为什么我使用方法 1 获得最佳性能。为什么 DISPATCH_QUEUE_PRIORITY_BACKGROUND 提供比 HIGH 更好的性能。为什么 NSOperationQueue 的结果比 GCD 好?