将许多浮动转换为NSNumbers时的性能问题

时间:2013-05-04 21:11:21

标签: objective-c arrays performance nsmutablearray nsnumber

在我的应用程序中,我收到一个包含30,000个对象的CSV文件,每个对象总共有24个值(总共720,000个值)。

格式是这样的:

  

object1,值1,值2,...,value24
  对象2,值1,值2,...,value24
  ...
  objectn,value1,value2,...,value24

当我解析此文件时,我会转换NSArray NSString中的每一行。 接下来,我为数组的每个值执行以下操作:

  1. 使用NSString
  2. float转换为- (float)floatValue
  3. float转换为NSNumber
  4. NSNumber存储在NSMutableArray
  5. 此过程需要几秒钟,而Instruments Time Profiler我在第2步和第2步花费3.5秒3为720,000个值。

    如何继续避免NSNumber翻译?我可以使用C样式数组,例如[]吗?还是CFMutableArrayRef?如果它有帮助,我知道每个对象总有24个值。

    感谢您的帮助,

    塞巴斯蒂安。

2 个答案:

答案 0 :(得分:1)

根据您以后计划如何使用这些值,有不同的方法。

  1. 将整个float数组存储为单个NSValue。优点:施工速度提高24倍。缺点:您必须提取所有项目才能访问其中任何项目。
  2. 将值保留为字符串。优点:没有浪费时间。缺点:频繁访问会浪费时间。
  3. 设计一个保留单个记录的类:一个NSString和24个浮点属性。优点:单一记录统治一切。缺点:单一记录规则一切。
  4. upd:如果您想到在案例3中手动命名24个字段value1 .. value24的不便,请随意在类的接口部分声明公共数组。这将记录对象的诞生与c风格的数组相结合。您还可以向该类添加-[valueAtIndex:]-[setValue:atIndex:]方法,并将实数数组设为私有。

答案 1 :(得分:0)

就个人而言,我只使用C风格的数组。如果要逐行处理数据,可以使用表示每行的对象,如下所示:

@interface Row : NSObject {
  float values[24];
}
@end

然后为每行创建 Row 实例,直接设置24个值,并将实例添加到NSMutableArray。

Row *row = [[[Row alloc] init] autorelease];
// here's where you read in the data for the row and save the 24 values
row.values[0] = ...
...
row.values[23] = ...
// and here you add the Row instance to an NSMutableArray
[rows addObject:row];

否则,如果你事先知道你会预期30,000行,那么你可以预先分配一个30,000 x 24的浮点阵列。

float *rows = calloc(30000*24, sizeof(float));
for (int i = 0; i < 30000; i++) {
  float *values = rows[24*i];
  // here's where you read in the data for row i and save the 24 values
  values[0] = ...
  ...
  values[23] = ...
}

不要忘记,当你完成它时,你需要释放calloc的内存。