এটি গৃহীত উত্তর হিসাবে প্রায় একই তবে কিছু যুক্ত সংলাপের সাথে (আমার রব নেপিয়ার, তার অন্যান্য উত্তর এবং ম্যাট, অলিভার, স্ল্যাক থেকে ডেভিড) এবং লিঙ্কগুলি ছিল।
এই আলোচনায় মন্তব্য দেখুন । এর সারাংশটি হ'ল:
+
ভারী ভারী হয়েছে (অ্যাপল কিছু ক্ষেত্রে এটি স্থির করেছে বলে মনে হচ্ছে)
+
অপারেটর প্রচন্ডভাবে ওভারলোড হয়ে গেছে, এখন যেমন 27 বিভিন্ন ফাংশন তাই যদি আপনি concatenating 4 স্ট্রিং অর্থাৎ হয়েছে আপনি 3 আছে +
অপারেটার কম্পাইলার আছে পরীক্ষা 27 অপারেটার প্রতিটি সময় মধ্যে, যাতে 27 ^ 3 বার আছে। তবে তা নয়।
এখানে একটা হল চেক কিনা তা দেখতে lhs
এবং rhs
এর +
ফাংশন উভয় বৈধ যদি তারা এটি কোর মাধ্যমে কল হয় append
বলা হয়। সেখানে আপনি দেখতে পাচ্ছেন কিছুটা নিবিড় চেক রয়েছে যা ঘটতে পারে। যদি স্ট্রিংটি অ-স্বচ্ছভাবে সংরক্ষণ করা হয়, তবে আপনি যদি স্ট্রিংটি ব্যবহার করছেন সে স্ট্রিংটি এনএসএসআরটিংয়ের সাথে আসলে সেতুবন্ধিত হয় তবে কেসটি প্রদর্শিত হবে। তারপরে সুইফ্টকে সমস্ত বাইট অ্যারে বাফারগুলিকে একটি একক সঙ্গতিপূর্ণ বাফারে পুনরায় একত্রিত করতে হবে এবং যার জন্য নতুন বফার তৈরি করতে হবে। এবং তারপরে আপনি শেষ পর্যন্ত একটি বাফার পাবেন যার মধ্যে স্ট্রিং রয়েছে যা আপনি একসাথে একত্রিত করার চেষ্টা করছেন।
সংক্ষেপে 3 টি ক্লাস্টার সংকলক চেক রয়েছে যা আপনাকে ধীর করে দেবে অর্থাত্ প্রতিটি উপ-এক্সপ্রেশনটি ফিরে আসতে পারে এমন সমস্ত কিছুর আলোকে পুনর্বিবেচনা করতে হবে । ফলস্বরূপ সংক্ষিপ্তকরণের স্ট্রিংগুলি ইন্টারপোলেশন সহ অর্থাত্ ব্যবহার " My fullName is \(firstName) \(LastName)"
করা অনেক ভাল কারণ "My firstName is" + firstName + LastName
যেহেতু ইন্টারপোলেশনের কোনও ওভারলোডিং নেই using
সুইফট 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))"
?