“流式传输”数据:保持解析器打开或不断创建一个新的?

时间:2011-02-18 09:05:33

标签: iphone objective-c parsing performance nsxmlparser

我想知道我正在做什么更有效:

我带来了(非常小 - 每个4kb或更少).xml文件,其中包含车辆的GPS坐标。然后我解析它们(涉及非常轻松的解析)并将它们发送回委托。

目前,我正在使用一个计时器,每1秒调用一次:

-(void)refreshGPSData:(NSTimer *)theTimer{
    GPSParser *parser = [[GPSParser alloc] initWithName:@"route"];
    [parser parseRssFeed:@"http://thefeed.com/feed.xml" withDelegate:self];
    [parser release];
}

我的问题是,以不同的方式执行此操作是否更有效,而不是持续分配和启动解析器?我应该只为一个解析器分配+ init,然后每1秒调用一次“parseRssFeed”。或者我应该不使用计时器,而是每次解析器完成并将数据返回给委托时调用“parseRssFeed”?什么是最佳编程实践?

如果我提供了足够的信息,请告诉我。 谢谢!

1 个答案:

答案 0 :(得分:1)

这取决于您希望使用解析器的频率。如果您每分钟只解析一次数据,则无需在对象中存储解析器 如果您每秒解析数据10次,则必须分配一次并存储解析器。

另一张海报(由于这不是.net问题而删除了他的答案)建议我做了一点性能测试,以证明一个分配是一个非常慢的操作。

for (NSTimeInterval i = 0; i < 1000; i++) {
    self.label1.text = [dateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:i]];
}

vs

for (NSTimeInterval i = 0; i < 1000; i++) {
    NSDateFormatter *localDateFormatter = [[NSDateFormatter alloc] init];
    self.label2.text = [localDateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceNow:i]];
    [localDateFormatter release];
}

第一个版本的结果为0.0017秒,第二个版本的结果为0.28秒。你会明白的。是的,NSDateFormatter可能是一个更复杂的对象示例之一。

如果你想经常使用像解析器或日期格式的对象,我会将它存储在某个地方。