当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 为什么swift的角色比较这么慢?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我在 swift中编写了一些代码,其中包含大量字符比较,发现它非常慢.当我检查了Instruments时,它说大约有33%的cpu被两个字符的infix ==占用,所以我写了这个来测试它: import Foundationlet numTim
我在 swift中编写了一些代码,其中包含大量字符比较,发现它非常慢.当我检查了Instruments时,它说大约有33%的cpu被两个字符的infix ==占用,所以我写了这个来测试它:

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

有谁知道为什么会这样?

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

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

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

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

当我有更多时间深入时,我会更新答案以确认.

网友评论