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.

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

  • 将整个浮点数组存储为单个NSValue。优点:施工速度提高24倍。缺点:您必须提取所有项才能访问其中任何项
  • 将值保留为字符串。优点:不浪费时间。缺点:频繁访问会浪费时间
  • 设计一个保持单个记录的类:一个NSString和24个float属性。优点:单唱片主宰一切。缺点:单记录主宰一切

  • upd:如果您觉得不便,请手动命名24个字段
    value1
    <代码>值24在案例3中,可以在类的接口部分声明公共数组。这将把记录对象的本征性和c样式数组结合起来。您还可以向该类添加
    -[valueAtIndex:
    -[setValue:atIndex:
    方法,并将实数组设为私有。

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

  • 将整个浮点数组存储为单个NSValue。优点:施工速度提高24倍。缺点:您必须提取所有项才能访问其中任何项
  • 将值保留为字符串。优点:不浪费时间。缺点:频繁访问会浪费时间
  • 设计一个保持单个记录的类:一个NSString和24个float属性。优点:单唱片主宰一切。缺点:单记录主宰一切

  • 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样式数组更新了部分代码。再