【问题标题】:Faster way for NSMutableDictionary checkNSMutableDictionary 检查的更快方法
【发布时间】:2016-07-14 00:11:04
【问题描述】:

我正在做一些应用程序优化,并且在大循环中对 NSMutableDictionary 的检查相当费力:

if ([self.variantBufferSequence objectForKey:[variant valueForKey:@"model_no"]] == nil) {
    [self.variantBufferSequence setObject:[NSMutableDictionary new] forKey:[variant valueForKey:@"model_no"]];
}

有没有更简单的方法来检查if-statement 中的条目 (objectForKey) 是否存在?

【问题讨论】:

  • 您是否检查过大部分时间是否花在objectForKey
  • 为什么你认为objectForKey: 调用比valueForKey 调用更昂贵(这通常是两者中较慢的,并且可能非常慢)。 variant 是什么?这个测试经常是真的吗?当您对此进行分析时,Instruments 说了什么?孤立地优化一行代码很少是正确的方法。什么值在循环中发生变化?这本词典有多大?

标签: objective-c nsmutabledictionary


【解决方案1】:

在 objc 和 clang 的最新版本中,您可以使用更紧凑的符号检查字典中是否存在键。

这个小例子对我有用:

NSMutableDictionary *description = @{@"model_no":@"key1"}.mutableCopy;
NSMutableDictionary *dictionary = @{@"key1":@"value1"}.mutableCopy;

if(dictionary[description[@"model_no"]]){
    NSLog(@"It exists!");
} else {
    NSLog(@"It doesn't exists!");
}

尝试在description 中将key1 替换为key2

Reference

【讨论】:

  • 在我的测试中,objectForKey: 比下标略快(我怀疑objectForKeyedSubscript: 是作为对objectForKey: 的调用实现的)。无论哪种方式,我都不认为它很重要,但是您有什么理由相信这种方法比 OP 的代码更快? (忽略 valueForKey: 的删除,仅当 variant 是字典时才有效。)
  • 这给了我一个非常小的速度提升。 variant 确实是一个包含大约 20 个小值的可变字典。我用 Time Profiler 反复测试它并获得了大约 5% 的增益。我希望有更壮观的东西,但不要抱怨:)
猜你喜欢
  • 2011-02-07
  • 2017-07-12
  • 1970-01-01
  • 2014-01-02
  • 2011-08-04
  • 2011-10-20
  • 2012-03-08
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多