下面的代码将简单的值持有者映射到布尔值,在Java中的运行速度比Swift 2 - XCode 7 beta3,"最快,最具侵略性的优化[-Ofast]"以及"快速,整体模块优化"开启速度快20倍.我可以在Java中获得超过280M的查询/秒,但在Swift中只有大约10M.
当我在Instruments中查看它时,我发现大多数时间都会进入与地图查找相关的一对保留/释放调用.任何关于为什么会发生这种情况或解决方法的建议都将受到赞赏.
代码的结构是我的真实代码的简化版本,它具有更复杂的密钥类,并且还存储其他类型(尽管布尔值是我的实际情况).另外,请注意我使用单个可变键实例进行检索以避免在循环内分配对象,根据我的测试,这在Swift中比在不可变键中更快.
编辑:我也试过切换到NSMutableDictionary,但当与Swift对象一起使用时,它看起来非常慢.
EDIT2:我已经尝试在objc中实现测试(它没有可选的解包开销)并且速度更快但仍然比Java慢一个数量级...我将把这个例子作为另一个问题提出来看看是否有人有想法.
EDIT3 - 答案.我在下面的答案中公布了我的结论和解决方法.
public final class MyKey : Hashable {
var xi : Int = 0
init( _ xi : Int ) { set( xi ) }
final func set( xi : Int) { self.xi = xi }
public final var hashValue: Int { return xi }
}
public func == (lhs: MyKey, rhs: MyKey) -> Bool {
if ( lhs === rhs ) { return true }
return lhs.xi==rhs.xi …Run Code Online (Sandbox Code Playgroud)