gpt4 book ai didi

objective-c - NSMutableDictionary 比 Java Map 慢得多……为什么?

转载 作者:太空狗 更新时间:2023-10-30 03:26:45 24 4
gpt4 key购买 nike

以下代码将简单的值持有者映射到对象,在 Java 中的运行速度比使用 XCode 7 beta3“Fastest, Aggressive Optimizations [-Ofast]”的 Objective-C 快 15 倍以上。我可以在 Java 中获得超过 280M 的查找/秒,但在 objc 示例中只有大约 19M。 (我在这里发布了相应的 Java 代码,因为这是作为 Swift 比较开始的:Swift Dictionary slow even with optimizations: doing uncessary retain/release?)。

这是我的真实代码的简化版本,它肯定受哈希查找时间的限制,并且也表现出这种整体性能差异。在下面的测试中,我正在测试 null 的值,只是为了确保编译器不会优化查找,但在实际应用中,大多数情况下我会使用该值。

当我查看工具时,我发现很多时间花在保留/释放、msgSend 和一些我不理解的锁定调用上。

任何关于什么可以解释这比 Java 慢 10-15 倍的想法或任何解决方法将不胜感激。实际上,我可以实现如下所示的完美哈希,这样我就可以使用适用于 iOS 的快速 int-object 字典(如果我能找到的话)。

@interface MyKey : NSObject <NSCopying>
@property int xi;
@end

@implementation MyKey
- (NSUInteger)hash { return self.xi; }
- (BOOL)isEqual:(id)object { return ((MyKey *)object).xi == self.xi; }
- (id)copyWithZone:(NSZone *)zone { return self; }

@end

NSMutableDictionary *map = [NSMutableDictionary dictionaryWithCapacity:2501];
NSObject *obj = [[NSObject alloc] init];

int range = 2500;
for (int x=0; x<range; x++) {
MyKey *key = [[MyKey alloc] init];
key.xi=x;
[map setObject:obj forKey:key];
}

MyKey *key = [[MyKey alloc] init];
int runs = 50;
for (int run=0; run<runs; run++)
{
NSDate *start = [NSDate date];

int reps = 10000;
for(int rep=0; rep<reps; rep++)
{
for (int x=0; x<range; x++) {
key.xi=x;
if ( [map objectForKey:key] == nil ) { NSLog(@"missing key"); }
}
}

NSLog(@"rate = %f", reps*range/[[NSDate date] timeIntervalSinceDate:start]);
}

最佳答案

您可以像这样重新实现您的 -isEqual: 方法以避免属性访问器:

- (BOOL) isEqual:(id)other
{
return _xi == ((MyKey*)other)->_xi;
}

如果您的 MyKey 类可能被子类化,那将是 Not Acceptable ,但我从 Java 代码中看到该类是 final

关于objective-c - NSMutableDictionary 比 Java Map 慢得多……为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31440621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com