使用配置了自定义回调的CFSet
和CFDictionary
使用整数作为键时,我注意到其内部哈希实现的性能差异很大。我使用64位整数(int64_t),范围大约为1 - 1,000,000。
在分析我的应用程序时,我注意到,每隔一段时间,某些因素组合会产生异常糟糕的性能。看看乐器,CFBasicHash
比平时花费的时间更长。
经过一系列的调查后,我最终将事情缩小到一组400,000个整数,当加到CFSet
或CFDictionary
时会导致哈希表现糟糕。
CFBasicHash.m中的哈希实现超出了我对这类问题的理解,所以我想知道是否有人知道为什么这样一组完全随机的整数会导致这种可怕的性能。
以下测试应用程序将输出37ms
的平均迭代时间,用于将连续整数添加到集合中,但添加相同数字时的平均运行时间为3622ms
整数,但来自有问题的数据集。
(如果你插入相同数量的完全随机整数,那么性能更接近37ms
。同样,将这些有问题的整数添加到std::map
或{{1}产生可接受的性能。)
std:set
示例输出:
这里有整数:
任何人都可以帮助解释什么是特殊的&#34;关于可能导致#import <Foundation/Foundation.h>
extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));
int main(int argc, char *argv[]) {
@autoreleasepool {
NSString *data = [NSString stringWithContentsOfFile:@"Integers.txt" encoding:NSUTF8StringEncoding error:NULL];
NSArray *components = [data componentsSeparatedByString:@","];
NSInteger count = components.count;
int64_t *numbers = (int64_t *)malloc(sizeof(int64_t) * count);
int64_t *sequentialNumbers = (int64_t *)malloc(sizeof(int64_t) * count);
for (NSInteger c = 0; c < count; c++) {
numbers[c] = [components[c] integerValue];
sequentialNumbers[c] = c;
}
NSLog(@"Beginning test with %@ numbers...", @(count));
// Test #1 - Loading sequential integers
uint64_t t1 = dispatch_benchmark(10, ^{
CFMutableSetRef mutableSetRef = CFSetCreateMutable(NULL, 0, NULL);
for (NSInteger c = 0; c < count; c++) {
CFSetAddValue(mutableSetRef, (const void *)sequentialNumbers[c]);
}
NSLog(@"Sequential iteration completed with %@ items in set.", @(CFSetGetCount(mutableSetRef)));
CFRelease(mutableSetRef);
});
NSLog(@"Sequential Numbers Average Runtime: %llu ms", t1 / NSEC_PER_MSEC);
NSLog(@"-----");
// Test #2 - Loading data set
uint64_t t2 = dispatch_benchmark(10, ^{
CFMutableSetRef mutableSetRef = CFSetCreateMutable(NULL, 0, NULL);
for (NSInteger c = 0; c < count; c++) {
CFSetAddValue(mutableSetRef, (const void *)numbers[c]);
}
NSLog(@"Dataset iteration completed with %@ items in set.", @(CFSetGetCount(mutableSetRef)));
CFRelease(mutableSetRef);
});
NSLog(@"Dataset Average Runtime: %llu ms", t2 / NSEC_PER_MSEC);
free(sequentialNumbers);
free(numbers);
}
}
和CFSet
使用的哈希实现中出现这种降级的给定整数?