arm64 objectForKey性能异常?

时间:2014-04-03 20:08:33

标签: ios iphone objective-c performance arm64

为了讲一个简短的故事,我在32位iPhone应用程序中查看性能问题。在这个过程中,我删除了限制我为32位的第三方库,当我为arm64构建时,我发现在与该库无关的代码段中,速度提高了2倍。

我的印象是简单地将arm64添加到有效架构中并不会带来性能的显着提升,所以我想知道我的案例是否只是一个异常现象。

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

以下代码是示例应用程序的全部内容 - 放置在viewDidLoad中。使用X64 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);

1 个答案:

答案 0 :(得分:1)

很难说具体改进了这项测试。 arm64与armv7有很多变化,可能会影响性能。一些例子:

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

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