Ini hampir sama dengan jawaban yang diterima tetapi dengan beberapa dialog tambahan (saya miliki dengan Rob Napier, jawaban lainnya dan Matt, Oliver, David dari Slack) dan tautan.
Lihat komentar dalam diskusi ini . Intinya adalah:
+
sangat kelebihan beban (Apple tampaknya telah memperbaiki ini untuk beberapa kasus)
The +
Operator ini sangat kelebihan beban, seperti yang sekarang memiliki 27 fungsi yang berbeda jadi jika Anda concatenating 4 senar yaitu Anda memiliki 3 +
operator compiler harus memeriksa antara 27 operator setiap kali, jadi itu 27 ^ 3 kali. Tapi bukan itu.
Ada juga cek untuk melihat apakah lhs
dan rhs
dari +
fungsi keduanya berlaku jika mereka itu panggilan melalui ke inti append
disebut. Di sana Anda dapat melihat ada sejumlah pemeriksaan agak intensif yang dapat terjadi. Jika string disimpan secara tidak bersamaan, yang tampaknya menjadi kasus jika string yang Anda hadapi sebenarnya dijembatani ke NSString. Swift kemudian harus merakit kembali semua buffer array byte menjadi buffer yang berdekatan dan yang membutuhkan membuat buffer baru di sepanjang jalan. dan akhirnya Anda mendapatkan satu buffer yang berisi string yang Anda coba gabungkan bersama.
Singkatnya ada 3 kelompok pemeriksaan kompiler yang akan memperlambat Anda yaitu masing-masing sub-ekspresi harus dipertimbangkan kembali mengingat segala hal yang mungkin kembali . Alhasil string yang disatukan dengan interpolasi yaitu menggunakan " My fullName is \(firstName) \(LastName)"
jauh lebih baik daripada "My firstName is" + firstName + LastName
karena interpolasi tidak memiliki kelebihan
Swift 3 telah membuat beberapa peningkatan. Untuk informasi lebih lanjut, baca Bagaimana cara menggabungkan banyak Array tanpa memperlambat kompiler? . Meskipun demikian +
operator masih kelebihan beban dan lebih baik menggunakan interpolasi string untuk string yang lebih lama
Penggunaan opsional (masalah berkelanjutan - solusi tersedia)
Dalam proyek yang sangat sederhana ini:
import UIKit
class ViewController: UIViewController {
let p = Person()
let p2 = Person2()
func concatenatedOptionals() -> String {
return (p2.firstName ?? "") + "" + (p2.lastName ?? "") + (p2.status ?? "")
}
func interpolationOptionals() -> String {
return "\(p2.firstName ?? "") \(p2.lastName ?? "")\(p2.status ?? "")"
}
func concatenatedNonOptionals() -> String {
return (p.firstName) + "" + (p.lastName) + (p.status)
}
func interpolatedNonOptionals() -> String {
return "\(p.firstName) \(p.lastName)\(p.status)"
}
}
struct Person {
var firstName = "Swift"
var lastName = "Honey"
var status = "Married"
}
struct Person2 {
var firstName: String? = "Swift"
var lastName: String? = "Honey"
var status: String? = "Married"
}
Waktu kompilasi untuk fungsi adalah sebagai berikut:
21664.28ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:16:10 instance method concatenatedOptionals()
2.31ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:20:10 instance method interpolationOptionals()
0.96ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:24:10 instance method concatenatedNonOptionals()
0.82ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:28:10 instance method interpolatedNonOptionals()
Perhatikan betapa gila durasi kompilasi concatenatedOptionals
ini.
Ini dapat diselesaikan dengan melakukan:
let emptyString: String = ""
func concatenatedOptionals() -> String {
return (p2.firstName ?? emptyString) + emptyString + (p2.lastName ?? emptyString) + (p2.status ?? emptyString)
}
yang mengkompilasi di 88ms
Akar penyebab masalah adalah bahwa kompiler tidak mengidentifikasi ""
sebagai a String
. SebenarnyaExpressibleByStringLiteral
Compiler akan melihat ??
dan harus mengulang semua tipe yang sesuai dengan protokol ini , sampai ia menemukan tipe yang dapat menjadi default String
. Dengan Menggunakan emptyString
hardcoded String
, kompiler tidak perlu lagi mengulang semua tipe yang sesuaiExpressibleByStringLiteral
Untuk mempelajari cara mencatat waktu kompilasi, lihat di sini atau di sini
Jawaban serupa lainnya oleh Rob Napier di SO:
Mengapa penambahan string membutuhkan waktu lama untuk dibangun?
Bagaimana cara menggabungkan banyak Array tanpa memperlambat kompiler?
Swift Array berisi fungsi membuat waktu build menjadi panjang
var statement = "create table if not exists \(self.tableName()) (\(columns))"
:?