यह लगभग स्वीकृत उत्तर के समान है लेकिन कुछ अतिरिक्त संवादों के साथ (मैं रोब नेपियर, उनके अन्य उत्तर और मैट, ओलिवर, स्लैक से डेविड) और लिंक के साथ था।
इस चर्चा में टिप्पणियों को देखें । इसका सार यह है:
+
भारी भरकम है (कुछ मामलों के लिए Apple ने यह तय किया है)
+
ऑपरेटर भारी ओवरलोड हो गया है, अब के रूप में यह 27 विभिन्न कार्यों इसलिए यदि आप श्रृंखलाबद्ध कर रहे हैं 4 तार अर्थात आप 3 +
ऑपरेटरों संकलक गया है की जाँच 27 ऑपरेटरों हर बार के बीच है, ताकि 27 ^ 3 बार है। लेकिन ऐसा नहीं है।
वहाँ भी एक है की जांच करता है, तो देखने के लिए lhs
और rhs
के +
कार्यों दोनों वैध अगर वे इसे कोर के माध्यम से कॉल कर रहे हैं append
कहा जाता है। वहाँ आप देख सकते हैं कि कुछ गहन जाँचें हो सकती हैं। यदि स्ट्रिंग को गैर-सन्निहित रूप से संग्रहीत किया जाता है, जो ऐसा प्रतीत होता है यदि आप जिस स्ट्रिंग के साथ काम कर रहे हैं वह वास्तव में NSString के लिए ब्रिज किया गया है। तब स्विफ्ट को सभी बाइट सरणी बफ़र्स को एक एकल सन्निहित बफर में फिर से इकट्ठा करना पड़ता है और इसके लिए नए बफ़र्स बनाने की आवश्यकता होती है। और फिर आपको अंततः एक बफर मिलता है जिसमें वह स्ट्रिंग होती है जिसे आप एक साथ जोड़ने का प्रयास कर रहे होते हैं।
संक्षेप में, कंपाइलर चेक के 3 क्लस्टर हैं जो आपको धीमा कर देंगे अर्थात प्रत्येक उप-अभिव्यक्ति को हर उस चीज़ के प्रकाश में पुनर्विचार करना होगा जो वह वापस आ सकती है । एक परिणाम के रूप में प्रक्षेप के साथ तार को जोड़ने का उपयोग " My fullName is \(firstName) \(LastName)"
करना यानी का उपयोग करना बेहतर है "My firstName is" + firstName + LastName
क्योंकि प्रक्षेप से कोई अतिभार नहीं होता है
स्विफ्ट 3 में कुछ सुधार किए गए हैं । अधिक जानकारी के लिए नीचे संकलक को धीमा किए बिना कई एरे को कैसे मर्ज करें? । फिर भी, +
ऑपरेटर अभी भी अतिभारित है और लंबे समय तक तार के लिए स्ट्रिंग प्रक्षेप का उपयोग करना बेहतर है
वैकल्पिक का उपयोग (चल रही समस्या - समाधान उपलब्ध)
इस बहुत ही सरल परियोजना में:
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"
}
कार्यों के लिए संकलन समय इस प्रकार है:
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()
ध्यान दें कि पागल अवधि के लिए संकलन अवधि कितनी अधिक concatenatedOptionals
है।
इसे करने से हल किया जा सकता है:
let emptyString: String = ""
func concatenatedOptionals() -> String {
return (p2.firstName ?? emptyString) + emptyString + (p2.lastName ?? emptyString) + (p2.status ?? emptyString)
}
जिसमें संकलन है 88ms
समस्या का मूल कारण यह है कि संकलक ""
एक के रूप में पहचान नहीं करता है String
। यह वास्तव में हैExpressibleByStringLiteral
कंपाइलर देखेगा ??
और सभी प्रकार के माध्यम से लूप करना होगा जो इस प्रोटोकॉल के अनुरूप है , जब तक कि वह एक प्रकार नहीं पाता है जो कि डिफ़ॉल्ट हो सकता है String
। emptyString
जिसके उपयोग से हार्डकोड किया जाता है String
, कंपाइलर को सभी अनुरूप प्रकारों के माध्यम से लूप करने की आवश्यकता नहीं हैExpressibleByStringLiteral
संकलन समय लॉग करने के लिए सीखने के लिए यहां या यहां देखें
एसओ पर रोब नेपियर के अन्य समान जवाब:
स्ट्रिंग को बनाने में इतना समय क्यों लगता है?
कंपाइलर को धीमा किए बिना कई एरे को कैसे मर्ज किया जाए?
स्विफ्ट एरे में फ़ंक्शन होता है जो बिल्ड समय को लंबा करता है
var statement = "create table if not exists \(self.tableName()) (\(columns))"
:?