परिचय
मोबाइल और डेस्कटॉप एप्लिकेशन का प्रदर्शन उपयोगकर्ता अनुभव को प्रभावित करने वाला एक महत्वपूर्ण कारक है। उपयोगकर्ता उम्मीद करते हैं कि एप्लिकेशन तेज़ी से, सुचारू रूप से और बिना देरी के चलें। Apple इकोसिस्टम (iOS, macOS, watchOS, tvOS) के लिए एप्लिकेशन बनाने वाले Swift डेवलपर्स के लिए, प्रदर्शन अनुकूलन केवल वांछनीय नहीं बल्कि एक अनिवार्य कार्य बन जाता है। इस लेख में, हम Swift एप्लिकेशन के प्रदर्शन को अनुकूलित करने के मुख्य तरीकों को देखेंगे, जिसमें मेमोरी प्रबंधन से लेकर मल्टीथ्रेडिंग के साथ कुशल कार्य शामिल है। आप सीखेंगे कि सामान्य गलतियों से कैसे बचें और अपने एप्लिकेशन को यथासंभव तेज़ कैसे बनाएं।
1. मेमोरी प्रबंधन और ARC
Swift मेमोरी प्रबंधन के लिए ऑटोमैटिक रेफरेंस काउंटिंग (ARC) का उपयोग करता है। हालांकि, ARC का अनुचित उपयोग मेमोरी लीक और प्रदर्शन में कमी का कारण बन सकता है। मुख्य समस्या रिटेन साइकिल है।
1.1. रिटेन साइकिल से बचें
रिटेन साइकिल तब होती है जब दो ऑब्जेक्ट एक-दूसरे को संदर्भित करते हैं, और ARC उनकी मेमोरी को डीलोकेट नहीं कर पाता है। चक्र को तोड़ने के लिए weak या unowned का उपयोग करें।
class Person { let name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print("\\(name) deallocated") }}
class Apartment { let unit: String weak var tenant: Person? // weak एक रिटेन साइकिल को रोकता है init(unit: String) { self.unit = unit } deinit { print("Apartment \\(unit) deallocated") }}
var john: Person? = Person(name: "John")var unit4A: Apartment? = Apartment(unit: "4A")john?.apartment = unit4Aunit4A?.tenant = johnjohn = nilunit4A = nil// दोनों ऑब्जेक्ट डीलोकेट हो जाएंगे1.2. रेफरेंस टाइप (क्लास) के बजाय वैल्यू टाइप (स्ट्रक्ट) का उपयोग करें
स्ट्रक्ट स्टैक पर संग्रहीत होते हैं, जो क्लास के हीप स्टोरेज की तुलना में तेज़ होता है। छोटे, अपरिवर्तनीय डेटा के लिए स्ट्रक्ट का उपयोग करें।
struct Point { var x: Double var y: Double}
class PointClass { var x: Double var y: Double init(x: Double, y: Double) { self.x = x self.y = y }}
// प्रदर्शन परीक्षणlet count = 1_000_000var start = CFAbsoluteTimeGetCurrent()var points = [Point](repeating: Point(x: 0, y: 0), count: count)for i in 0..<count { points[i].x = Double(i)}print("Structs: \\(CFAbsoluteTimeGetCurrent() - start) seconds")
start = CFAbsoluteTimeGetCurrent()var pointClasses = [PointClass]()for i in 0..<count { let p = PointClass(x: Double(i), y: 0) pointClasses.append(p)}print("Classes: \\(CFAbsoluteTimeGetCurrent() - start) seconds")2. मल्टीथ्रेडिंग (GCD) के साथ काम को अनुकूलित करना
ग्रैंड सेंट्रल डिस्पैच (GCD) कार्यों को समानांतर में निष्पादित करने का एक शक्तिशाली उपकरण है। अनुचित उपयोग डेडलॉक और प्रदर्शन में कमी का कारण बन सकता है।
2.1. सही कतारों का उपयोग करें
पृष्ठभूमि कार्यों के लिए, सर्विस की गुणवत्ता (QoS) के साथ वैश्विक कतारों का उपयोग करें:
.userInteractive— तत्काल प्रतिक्रिया की आवश्यकता वाले कार्यों के लिए (जैसे, एनिमेशन)।.userInitiated— उपयोगकर्ता द्वारा शुरू किए गए कार्यों के लिए (जैसे, डेटा लोड करना)।.utility— लंबे समय तक चलने वाले कार्यों के लिए (जैसे, फ़ाइल प्रोसेसिंग)।.background— उन कार्यों के लिए जो UI को प्रभावित नहीं करते हैं (जैसे, सिंक्रोनाइज़ेशन)।
DispatchQueue.global(qos: .userInitiated).async { // भारी कार्य let result = performHeavyCalculation() DispatchQueue.main.async { // मुख्य थ्रेड पर UI अपडेट करें self.updateUI(with: result) }}2.2. मुख्य थ्रेड को ब्लॉक करने से बचें
UI से संबंधित सभी ऑपरेशन मुख्य थ्रेड पर किए जाने चाहिए। भारी गणनाओं और नेटवर्क