为什么斯威夫特的角色比较如此缓慢?

时间:2014-11-18 07:26:09

标签: performance swift

我在swift中编写了一些代码,其中包含大量字符比较,发现它非常慢。当我检查仪器时,它说大约33%的cpu是由两个字符的中缀==,所以我写这个来测试它:

import Foundation
let numTimes = 1000000

let charA: Character = "a";
let charB: Character = "b";
let stringA: String = "a";
let stringB: String = "b";
let nsStringA: NSString = "a";
let nsStringB: NSString = "b";

var start = NSDate();
for var i = 0; i < numTimes; i++ {
    charA == charB;
}
println("Swift Char Time: \(start.timeIntervalSinceNow * -1)")

start = NSDate();
for var i = 0; i < numTimes; i++ {
    stringA == stringB;
}
println("Swift String Time: \(start.timeIntervalSinceNow * -1)")

start = NSDate();
for var i = 0; i < numTimes; i++ {
    nsStringA == nsStringB;
}
println("NSString Time: \(start.timeIntervalSinceNow * -1)")

结果:
Swift Char时间:2.94823098182678
Swift String Time:0.413999974727631
NSString时间:0.228329002857208

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:3)

我发现你的问题非常有趣,我更深入地了解了Swift文档,所以这是我的假设:

Character类型是Unicode标量(21位数),因此当您测试charA == charB时,CPU正在比较两个Unicode标量。

String是Unicode标量的集合,因此当您测试stringA == stringB时,CPU正在比较集合的哈希码,因此它比Unicode标量更轻量级。

我发现在Swift doc中:“ Swift的String类型与Foundation的NSString类无关桥接”,这可以解释NSString和{{之间的时差1}}比较。

我将更新答案以确认,我将有更多时间深入了解。