长话短说,我正在研究我的 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);