OS X上的CFSet和CFDictionary的散列性能差异很大

时间:2016-02-14 21:53:20

标签: objective-c macos performance hash core-foundation

使用配置了自定义回调的CFSetCFDictionary使用整数作为键时,我注意到其内部哈希实现的性能差异很大。我使用64位整数(int64_t),范围大约为1 - 1,000,000。

在分析我的应用程序时,我注意到,每隔一段时间,某些因素组合会产生异常糟糕的性能。看看乐器,CFBasicHash比平时花费的时间更长。

经过一系列的调查后,我最终将事情缩小到一组400,000个整数,当加到CFSetCFDictionary时会导致哈希表现糟糕。

CFBasicHash.m中的哈希实现超出了我对这类问题的理解,所以我想知道是否有人知道为什么这样一组完全随机的整数会导致这种可怕的性能。

以下测试应用程序将输出37ms的平均迭代时间,用于将连续整数添加到集合中,但添加相同数字时的平均运行时间为3622ms 整数,但来自有问题的数据集。

(如果你插入相同数量的完全随机整数,那么性能更接近37ms。同样,将这些有问题的整数添加到std::map或{{1}产生可接受的性能。)

std:set

示例输出:

  • 序列号平均运行时间:37毫秒
  • 数据集平均运行时间:3622 ms

这里有整数:

任何人都可以帮助解释什么是特殊的&#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使用的哈希实现中出现这种降级的给定整数?

0 个答案:

没有答案