哪种是在Swift 2中连接多个字符串的最快捷,最有效的方法?
// Solution 1...
let newString:String = string1 + " " + string2
// ... Or Solution 2?
let newString:String = "\(string1) \(string2)"
Run Code Online (Sandbox Code Playgroud)
或者它是程序员看待的唯一区别?
我在模拟器和iPhone6S Plus上运行了以下代码.两种情况下的结果都表明string1 + " " + string2我使用的字符串加法更快.我没有尝试使用不同类型的字符串,优化等,但您可以运行代码并检查您的特定字符串等.尝试在IBM Swift Sandbox中在线运行此代码.计时器结构来自这里:测量swift中的经过时间
要运行代码,请在Xcode中创建单个视图应用程序,并将以下代码添加到ViewController:
import UIKit
import CoreFoundation
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let a = "abscdefghi jkl¢€@sads dljlæejktæljæ leijroptjiæa Dog! iojeg r æioej rgæoija"
let b = a
timeStringAdding(a, string2: b, times: 1_000_000, repetitions: 5)
}
struct RunningTimer: CustomStringConvertible {
var begin:CFAbsoluteTime
var end:CFAbsoluteTime
init() {
begin = CFAbsoluteTimeGetCurrent()
end = 0
}
mutating func start() {
begin = CFAbsoluteTimeGetCurrent()
end = 0
}
mutating func stop() -> Double {
if (end == 0) { end = CFAbsoluteTimeGetCurrent() }
return Double(end - begin)
}
var duration:CFAbsoluteTime {
get {
if (end == 0) { return CFAbsoluteTimeGetCurrent() - begin }
else { return end - begin }
}
}
var description:String {
let time = duration
if (time > 100) {return " \(time/60) min"}
else if (time < 1e-6) {return " \(time*1e9) ns"}
else if (time < 1e-3) {return " \(time*1e6) µs"}
else if (time < 1) {return " \(time*1000) ms"}
else {return " \(time) s"}
}
}
func timeStringAdding(string1:String, string2:String, times:Int, repetitions:Int) {
var newString = ""
var i = 0
var j = 0
var timer = RunningTimer.init()
while j < repetitions {
i = 0
timer.start()
while i < times {
newString = string1 + " " + string2
i += 1
}
print("+ add \(timer)")
i = 0
timer.start()
while i < times {
newString = "\(string1) \(string2)"
i += 1
}
print("\\( add \(timer)")
j += 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
在iPhone 6S Plus上,它给出了:
+ add 727.977991104126 ms
\( add 1.1197350025177 s
+ add 693.499982357025 ms
\( add 1.11982899904251 s
+ add 690.113961696625 ms
\( add 1.12086200714111 s
+ add 707.363963127136 ms
\( add 1.13451600074768 s
+ add 734.095990657806 ms
\( add 1.19673496484756 s
Run Code Online (Sandbox Code Playgroud)
在模拟器(iMac Retina)上:
+ add 406.143009662628 ms
\( add 594.823002815247 ms
+ add 366.503953933716 ms
\( add 595.698952674866 ms
+ add 370.530009269714 ms
\( add 596.457958221436 ms
+ add 369.667053222656 ms
\( add 594.724953174591 ms
+ add 369.095981121063 ms
\( add 595.37798166275 ms
Run Code Online (Sandbox Code Playgroud)
大部分时间是为字符串结构分配和释放内存,对于那些真正好奇的人来说,运行Instruments panel带有Time Profiler用法的代码,看看如何为alloc和free等分配时间,与此处显示的机器代码有关.