【问题标题】:arm64 objectForKey performance an anomaly?arm64 objectForKey 性能异常?
【发布时间】:2014-04-03 20:08:33
【问题描述】:

长话短说,我正在研究我的 32 位 iPhone 应用程序的性能问题。在此过程中,我删除了限制我使用 32 位的第 3 方库,当我为 arm64 构建时,我看到与所述库无关的一段代码的速度提高了 2 倍。

我的印象是,简单地将 arm64 添加到 Valid Architectures 并不会显着提高性能,所以我想知道我的情况是否只是一个异常情况。

在将我的应用程序缩减到显示性能差异的几十行的过程中,我失去了一些收益,但它仍然很重要。字典键中的字符数和键中对象数量的混合等看似微小的变化会产生很大的不同。

以下代码是整个示例应用程序 - 放置在 viewDidLoad 中。使用 Xcode 5.1 使用 arm64 构建,在我的 iPhone 5s (iOS 7.1) 上运行以检索 2075 个字典对象的平均时间约为 0.6 秒,构建 armv7s 约为 1.0 秒。

对于一般可以利用的性能改进是否有简单的解释?

#define NUM_DICT_ENTRIES 2075
NSMutableDictionary *aDict = [[NSMutableDictionary alloc] init];
NSDictionary *keyDictionary;
for (int i = 0; i < NUM_DICT_ENTRIES; i++) {
    if (arc4random_uniform(2)) {
        keyDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                         [[NSProcessInfo processInfo] globallyUniqueString], @"entry",
                         [[NSProcessInfo processInfo] globallyUniqueString], @"category", nil];
    } else {
        keyDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                         [[NSProcessInfo processInfo] globallyUniqueString], @"entry",
                         [[NSProcessInfo processInfo] globallyUniqueString], @"category",
                         [[NSProcessInfo processInfo] globallyUniqueString], @"article", nil];
    }
    NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:[[NSProcessInfo processInfo] globallyUniqueString],@"xyzzy", nil];
    [aDict setObject:d forKey:keyDictionary];
}

#define NUM_ITERATIONS 10

NSTimeInterval runTime = 0;

for (int i = 0; i < NUM_ITERATIONS; i++) {
    NSDate *start = [NSDate date];

    for (NSDictionary *keyDictionary in aDict) {
        [[aDict objectForKey:keyDictionary] objectForKey:@"xyzzy"];
    }

    runTime += [[NSDate date] timeIntervalSinceDate:start];
}

NSLog(@"average of %d iterations = %f", NUM_ITERATIONS, runTime/NUM_ITERATIONS);

【问题讨论】:

  • 您是否启动了反编译器并查看了生成的 asm 代码?可能更快的代码正在使用新的/不同的操作码,从而大大加快了循环的某些功能。
  • 字典查找是基于哈希值执行的。 64 位密钥而不是 32 位密钥意味着更少的冲突?并不是说我希望你的小数据集中有很多冲突......
  • 同时使用字典(或其他复杂对象)作为字典键,虽然受支持,但将是一个性能问题。我可能很想从多个值构造单个字符串,而不是使用字典。

标签: ios iphone objective-c performance arm64


【解决方案1】:

很难说这个测试具体有什么改进。 arm64 与 armv7 的许多变化会影响性能。一些例子:

  • arm64 对某些类型使用 Objective-C 标记的指针对象。使用这些类型的代码可能会更快或使用更少的内存。
  • arm64 将大多数对象的 Objective-C 保留计数存储在对象本身而不是单独的表中。执行大量保留/释放流量的代码可能会更快。
  • arm64 指令集对某些操作更有效。执行正确类型的数学或内存操作的代码可能会更快。
  • arm64 的 64 位指针占用更多内存。指针过多且内存受限的代码可能会更慢。

两个版本的仪器跟踪可能会发现性能差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2016-09-11
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2010-11-12
    • 2023-04-03
    相关资源
    最近更新 更多