【问题标题】:Xcode NSMutableData replaceBytesInRange CPU usageXcode NSMutableData replaceBytesInRange CPU 使用率
【发布时间】:2015-03-29 18:59:08
【问题描述】:

我正在编写一个 Mp3 播放器。我正在从服务器下载 mp3 文件。文件已加密。我客户的加密方法很简单。他们只是在每个 X 字节中插入一个位。就像代码中的 323 一样。但是解密过程需要很长时间。 CPU使用率很大?为什么?我能做什么?

_mappedData = [[NSMutableData dataWithMappedContentsOfFile:_cachedPath] mutableCopy];

  Singleton *singleton = [Singleton sharedSingleton];

  NSLog(@"Decryption started");

  if(singleton.playerMode == PLAYERMODELISTEN)
  {
     int i = 323;
     while (i < [_mappedData length]) {
         [_mappedData replaceBytesInRange:NSMakeRange(i, 1) withBytes:NULL length:0];
         //CFDataDeleteBytes((CFMutableDataRef)_mappedData, CFRangeMake(i, 1000));
         i += 323;
     }
  }


  [General dismissGlobalHUD];

  NSLog(@"Decryption completed");

【问题讨论】:

  • 您是否进行了任何分析以查看一直在花费的时间?
  • 我尝试使用仪器并捕获一些信息。但我找不到任何东西。
  • iOS 还是 OSX?文件有多大?为什么要在NSMutableData 上致电mutableCopy
  • 映射文件的重点不是一次读入整个文件,甚至可能全部读入。但是您正在对整个文件进行更改,因此更改将创建对文件的读取和写入。文件 I/O 的时间成本很高。
  • iOS 项目。当我不使用 mutableCopy 时,项目正在崩溃。 EXC_BAD_ACCESS

标签: objective-c cpu-usage nsmutabledata


【解决方案1】:

最后我自己解决了这个问题。

NSMutableData *decryptedData = [[NSMutableData alloc] init];

  NSUInteger length = [_mappedData length];
  NSUInteger chunkSize = 500;
  NSUInteger offset = 0;

  do {
      NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
      NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[_mappedData bytes] + offset
                                           length:thisChunkSize
                                     freeWhenDone:NO];
      offset += (thisChunkSize + 1);

      [decryptedData appendData:chunk];

  } while (offset < length);

  _mappedData = decryptedData;

这就是我的解决方案。工作速度非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-22
    • 2012-06-06
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多