将NSArrays转换为C风格(双)数组的最快例程是什么?

时间:2010-02-08 22:18:58

标签: iphone c objective-c nsarray

我有2个NSArray(实际上是Mutable),我正在尝试将其转换为C样式的双数组,用于传递它们的c例程。

这是我的Objective-C例程:

NSMutableDictionary *childDictionary = [myParentDictionary objectForKey:resort_code];

latitudeArray = [childDictionary objectForKey:@"lat"];
longitudeArray = [childDictionary objectForKey:@"lon"];

int nvert = [latitudeArray count];
double laArray[nvert];
double loArray[nvert];

for(int i=0; i<nvert; i++) {
    double dLat = [[latitudeArray objectAtIndex:i]doubleValue];
    double dLon = [[longitudeArray objectAtIndex:i]doubleValue];
    laArray[i] = dLat;
    loArray[i] = dLon;
}

3G iPhone需要花费3-8秒(在模拟器上瞬间完成 - 这是在设备上测试的另一个原因)

有更快的方法吗?我必须以laArray[i]loArray[i]作为c样式的双精度数组。

(为了评论者的利益而扩展问题): 每个数组由@“38.448745”(lat)和@“ - 122.9847684”(lon)样式内容组成。我把这个cos推到NSArray上,lat和lon需要成为对象。我只是用过:

[latitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlat]];
[longitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlon]];

我想我可以将其改为:

[latitudeArray addObject:[NSNumber numberWithDouble: @"%.10f",dlat]];
[longitudeArray addObject:[NSNumber numberWithDouble: @"%.10f",dlon]];

...这可能会缩短

的转换时间
double dLat = [[latitudeArray objectAtIndex:i]doubleValue];

但是我还不需要那个确切的行来从NSString转换为double吗?它可能会更快地工作?

THX

5 个答案:

答案 0 :(得分:2)

对于将NSArray转换为C数组的一般情况,您可以使用getObjects:。但是,在这种情况下,希望你真正想要的不是转换NSArray,而是从某个未指定对象类型的NSArray派生一个双精度数组。

加快速度的一个显而易见的方法是fast enumeration,而不是发送消息来获取循环的每次迭代的对象。我怀疑真正的解决方案不在你的算法之外。缓慢可能来自将数组包含的任何对象转换为双精度,在这种情况下你需要找到一种方法 - 可能一直存储双倍,也许在后台进行转换等。如果你正在创建自己编排并且没有一些令人信服的理由将对象作为字符串,你应该使用NSNumbers。那些应该快一点。

答案 1 :(得分:2)

我怀疑你有一个像@"213.12385"这样的字符串数组,当你在它们上面调用doubleValue时需要对它进行解析和转换。如果问题出在那里,那么C数组与此无关。

我在这里添加的唯一内容是将鲨鱼投入其中并查看它花费的时间。如果花时间在doubleValue中找到一种不同的方式来解析字符串,在后台或其他东西进行预处理。如果它在objectAtIndex:中,也许快速枚举会有所帮助。如果它完全在其他地方那么你就知道这个片段并不慢。

答案 2 :(得分:2)

dlat是双重的,对吧?

所以而不是:

[latitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlat]];

执行:

[latitudeArray addObject:[NSNumber numberWithDouble:dlat]];

它们都响应doubleValue,但NSNumber不应该进行任何字符串解析,因为它已经存储为数值。而且你根本不需要去找字符串。

答案 3 :(得分:0)

最佳解决方案可能是确保这些值永远不会以NSArray NSString值结尾。我会在源头攻击这个。

所以你编辑了你的问题,并补充说你实际上在构建那些数组。那么为什么不从一开始就使用原生的双打或浮点数组呢?我通常建议不要这样做,但在你的情况下,听起来有很大的性能提升。

答案 4 :(得分:-1)

可能使用快速迭代,但我怀疑这会真正加快你的循环。