NSDate处理非常占用CPU

用户名

我的代码中有一个方法可以处理需要在NSDate中转换的字符串。这种方法每秒被称为数百次,显然效率很低。如何尽可能地改善它?

- (NSDate *)getDateFromString:(NSString *)dateString
{
    NSDateFormatter* formatter = [NSDateFormatter new];
    [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

    NSDate* date = [formatter dateFromString:dateString];

    if (date == nil) {
        [formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
        date = [formatter dateFromString:dateString];
    }
    return date;
}
炸弹

您可以做的第一件事就是不要在每次调用时都创建该格式化程序实例

创建格式化程序非常昂贵。从Apple的“数据格式指南”中:

创建日期格式器并不是一项便宜的操作。如果您可能经常使用格式化程序,则缓存单个实例通常比创建和处置多个实例更为有效。

您可以使用staticvar或属性和延迟加载模式来执行此操作例如,使用static

-(NSDate *)getDateFromString:(NSString *)dateString{
  static NSDateFormatter *formatterWithZone = nil;
  static NSDateFormatter *formatterWithoutZone = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    formatterWithZone = [NSDateFormatter new];
    [formatterWithZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    [formatterWithZone setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
    formatterWithoutZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
  });

  NSDate *date = [formatterWithZone dateFromString:dateString];
  //...
  date = [formatterWithoutZone dateFromString:dateString];
}

或者,如果要在其他地方使用格式化程序,请将其放在属性中:

@property (nonatomic) NSDateFormatter *formatterWithZone;
@property (nonatomic) NSDateFormatter *formatterWithoutZone;
//...

-(NSDateFormatter *)formatterWithZone{
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _formatterWithZone = [NSDateFormatter new];
    [_formatterWithZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
    [_formatterWithZone setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
  });
  return _formatterWithZone;
}

-(NSDateFormatter *)formatterWithoutZone{
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _formatterWithoutZone = [NSDateFormatter new];
    [_formatterWithoutZone setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z'"];
  });
  return _formatterWithoutZone;
}

-(NSDate *)getDateFromString:(NSString *)dateString{
  NSDate* date = [[self formatterWithZone] dateFromString:dateString];
  //...
  date = [[self formatterWithoutZone] dateFromString:dateString];
}

更新:还请查看(并赞扬)以下mrueg的有关NSCalendar -currentCalendar价格昂贵评论以上两种技术也都可以缓存NSCalendar实例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

处理帐户守护程序占用100%的CPU

来自分类Dev

Obj-C方法调用速度非常慢,会占用更多CPU吗?

来自分类Dev

倒置的占用CPU

来自分类Dev

gprof显示一个简单的信号处理程序占用大量CPU

来自分类Dev

批处理文件仅使用echo ^占用cpu和RAM?

来自分类Dev

gprof显示一个简单的信号处理程序占用大量CPU

来自分类Dev

占用大量CPU资源的解析

来自分类Dev

SQLite查询占用太多CPU

来自分类Dev

占用大量CPU的从属属性

来自分类Dev

RxJava sample()占用大量CPU

来自分类Dev

“ ps”占用了99%的CPU

来自分类Dev

“ ps”占用了99%的CPU

来自分类Dev

占用大量CPU资源的解析

来自分类Dev

SpriteKit占用大量CPU资源

来自分类Dev

“ps”占用了 99% 的 CPU

来自分类Dev

Ubuntu 5 i5处理器占用40-170%的CPU使用率

来自分类Dev

/ tmp中的Ubuntu 16.04(HyperV)非常大的文件,在系统空闲时保持大约1GB / h的速度增长,占用大量CPU和网络负载

来自分类Dev

处理“非常非常”的大型阵列

来自分类Dev

爬虫爬网占用大量CPU

来自分类Dev

简单的C ++ SFML程序占用大量CPU

来自分类Dev

Python中的线程占用过多的CPU

来自分类Dev

mount.ntfs进程占用CPU

来自分类Dev

OpenGL空项目占用太多CPU

来自分类Dev

mount.ntfs进程占用CPU

来自分类Dev

zsh进程占用了我95%的CPU

来自分类Dev

Firefox 7占用了我的CPU

来自分类Dev

简单的C ++ SFML程序占用大量CPU

来自分类Dev

爬虫爬网占用大量CPU

来自分类Dev

正在运行的线程占用大量CPU