Objective c 将多个浮点数转换为NSNUMBER时出现性能问题
在我的应用程序中,我收到一个Objective c 将多个浮点数转换为NSNUMBER时出现性能问题,objective-c,arrays,performance,nsmutablearray,nsnumber,Objective C,Arrays,Performance,Nsmutablearray,Nsnumber,在我的应用程序中,我收到一个CSV文件,其中包含30000个对象,每个对象始终有24个值(总共720000个值) 格式如下所示: 对象1、值1、值2、…、值24 对象2,值1,值2,…,值24 … 对象n、值1、值2、…、值24 解析此文件时,我转换NSString的NSArray中的每一行。 接下来,我对数组的每个值执行以下操作: 使用-(float)floatValue 将float转换为NSNumber 将NSNumber存储在NSMutableArray 这一过程需要几秒钟,从仪器时间分
CSV
文件,其中包含30000个对象,每个对象始终有24个值(总共720000个值)
格式如下所示:
对象1、值1、值2、…、值24对象2,值1,值2,…,值24
…
对象n、值1、值2、…、值24 解析此文件时,我转换
NSString
的NSArray
中的每一行。
接下来,我对数组的每个值执行以下操作:
-(float)floatValue
float
转换为NSNumber
NSNumber
存储在NSMutableArray
仪器时间分析器
我在第2步和第3步中花费了3.5秒来计算720000个值
如何继续避免NSNumber的翻译?我可以使用C风格的数组,比如[]
?或者CFMutableArrayRef
?如果有帮助,我知道每个对象总是有24个值
谢谢你的帮助
Sébastien.根据您以后计划如何使用这些值,有不同的方法
upd:如果您觉得不便,请手动命名24个字段
value1
<代码>值24在案例3中,可以在类的接口部分声明公共数组。这将把记录对象的本征性和c样式数组结合起来。您还可以向该类添加-[valueAtIndex:
和-[setValue:atIndex:
方法,并将实数组设为私有。根据您以后计划如何使用这些值,有不同的方法
upd:如果您觉得不便,请手动命名24个字段
value1
<代码>值24在案例3中,可以在类的接口部分声明公共数组。这将把记录对象的本征性和c样式数组结合起来。您还可以将-[valueAtIndex:
和-[setValue:atIndex:
方法添加到该类中,并将实数组设为私有数组。我个人只会使用C样式的数组。如果要逐行处理数据,可以使用表示每行的对象,如下所示:
@interface Row : NSObject {
float values[24];
}
@end
然后为每一行创建一个行实例,直接设置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];
否则,如果您预先知道将需要30000行,则可以预先分配30000 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] = ...
}
float*rows=calloc(30000*24,sizeof(float));
对于(int i=0;i<30000;i++){
浮点*值=行[24*i];
//这里是您读取第i行数据并保存24个值的地方
值[0]=。。。
...
值[23]=。。。
}
不过别忘了,当你处理完后,你需要从
calloc
中释放内存。就我个人而言,我只需要使用一个C风格的数组。如果要逐行处理数据,可以使用表示每行的对象,如下所示:
@interface Row : NSObject {
float values[24];
}
@end
然后为每一行创建一个行实例,直接设置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];
否则,如果您预先知道将需要30000行,则可以预先分配30000 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] = ...
}
float*rows=calloc(30000*24,sizeof(float));
对于(int i=0;i<30000;i++){
浮点*值=行[24*i];
//这里是您读取第i行数据并保存24个值的地方
值[0]=。。。
...
值[23]=。。。
}
请不要忘记,完成后您需要从
calloc
中释放内存。请尝试使用nsnumberformatter将nsstring直接转换为nsnumber的答案,并与我们共享分析结果。ps:您只需要一个nsnumberformatter;)实例请尝试使用nsnumberformatter将nsstring直接转换为nsnumber,并与我们共享分析结果。ps:您只需要一个nsnumberformatter;)实例这就是我要找的。我今天会测试它,并让你知道结果。谢谢我已经按照建议使用C样式数组更新了部分代码。结果很好。在我的测试中,我有38580个对象,每个对象有24个值。根据优化前时间分析器中的测量结果,拆分字符串、解析浮点、创建NSNumber和在NSArray中记录NSNumber的持续时间为3705ms,优化后为1728ms。我的内存占用也有所改善,但我还没有测量。谢谢@user951368您也可以尝试将它们保留为字符串(即拆分后不进行转换)。如果您只是在某种类型的表中显示值,并且它们不是具有多访问模式的昂贵计算的一部分,那么您可以仅在单元渲染回调时将它们转换为浮点(和格式)。运行时的惩罚太小,不会引起注意,但现在你根本不需要转换它。这就是我一直在寻找的。我今天会测试它,并让你知道结果。谢谢我已经按照建议使用C样式数组更新了部分代码。再