在Swift 2中连接字符串的最快方法

Jam*_*mes 7 swift swift2

哪种是在Swift 2中连接多个字符串的最快捷,最有效的方法?

// Solution 1...
let newString:String = string1 + " " + string2
// ... Or Solution 2?
let newString:String = "\(string1) \(string2)"
Run Code Online (Sandbox Code Playgroud)

或者它是程序员看待的唯一区别?

Han*_*son 8

我在模拟器和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等分配时间,与此处显示的机器代码有关.