2014-07-05 8 views
6

मैं स्विफ्ट (http://www.raywenderlich.com/74438/swift-tutorial-a-quick-start) के बारे में एक ट्यूटोरियल पढ़ रहा हूं और यह स्पष्ट रूप से टाइप प्रकार को सेट करने के लिए पूर्वनिर्धारित नहीं है क्योंकि यह इस तरह से अधिक पठनीय है।स्विफ्ट स्पष्टीकरण बनाम अवरुद्ध टाइपिंग: प्रदर्शन

मैं इस बिंदु के बारे में वास्तव में सहमत नहीं हूं लेकिन यह सवाल नहीं है। मेरा सवाल है: क्या यह स्पष्ट रूप से सेट करने के लिए प्रदर्शन (कंपाइलर ...) के संदर्भ में अधिक कुशल है?

उदाहरण के लिए, इस होगा: इस से अधिक कुशल var hello: Int = 56: var tutorialTeam = 56

+2

इसकी एक कंपाइलर जांच के बाद से, यह आपके ऐप के प्रदर्शन को प्रभावित नहीं करेगा। 'एक = 1' और' चलो एक: int = 1' पूरी तरह से समकक्ष हैं। यदि आप alt + क्लिक का उपयोग करके 'ए' का निरीक्षण करते हैं, तो यह इसका 'Int' प्रकार कहेंगे। – Jack

+0

क्या कंपाइलर इसे इंट के रूप में सेट करने से पहले 1 के लिए किसी भी प्रकार की जांच नहीं करेगा? – user2462805

+3

उम? शायद आप स्थिर प्रकार की अनुमान के बिंदु को समझ नहीं रहे हैं। जब आप एनोटेशन छोड़ देते हैं, तो इसका मतलब यह नहीं है कि कंपाइलर वैरिएबल को कुछ जेनेरिक रजिस्टर वैल्यू के रूप में मानता है जिसे इसे आसपास काम करना है। टाइप अनुमान पहले होता है, तब वैरिएबल का इलाज किया जाता है जैसे कि वह उस प्रकार के सभी अभिव्यक्तियों में उपयोग किया जाता था। अगर किसी कारण से कंपाइलर चर के प्रकार को कम नहीं कर सकता है, तो यह एक प्रकार की त्रुटि बन जाता है। रनटाइम पर कुछ भी नहीं होता है। होने के लिए कोई प्रदर्शन लाभ नहीं है। – CodaFi

उत्तर

13

वहाँ स्पष्ट प्रकार और कोड जो प्रकार निष्कर्ष का उपयोग करता है का उपयोग करता है प्रदर्शन में कोई अंतर नहीं कोड के बीच है। संकलित आउटपुट प्रत्येक मामले में समान है।

जब आप इस प्रकार को छोड़ देते हैं तो कंपाइलर बस इसका अनुमान लगाता है।

accepted answer में देखे गए बहुत छोटे अंतर सिर्फ आपके सामान्य माइक्रो बेंचमार्किंग कलाकृतियों हैं, और भरोसा नहीं किया जा सकता है!

चाहे आप स्पष्ट प्रकार शामिल करते हैं या नहीं, स्वाद का विषय है। कुछ संदर्भों में यह आपके कोड को और अधिक पठनीय बना सकता है।

एकमात्र समय यह आपके कोड में एक फर्क पड़ता है जब आप एक अलग प्रकार को निर्दिष्ट करना चाहते हैं जो संकलक अनुमान लगाएगा। एक उदाहरण के रूप:

var num = 2 

ऊपर कोड infers कि num एक Int है, की वजह से यह एक पूर्णांक शाब्दिक साथ initialised जा रहा है। लेकिन अगर आप कर सकते हैं 'शक्ति' यह एक Double इस प्रकार हो:

var num: Double = 2 
+0

यह सही उत्तर है। संकलित आउट समान है, इसलिए प्रदर्शन में कोई अंतर करने के लिए स्पष्ट या निहित प्रकारों के लिए यह सचमुच असंभव है। –

+0

@ पॉलमंटा - धन्यवाद, यह मुझे स्वीकार किए गए उत्तर को स्पष्ट रूप से गलत होने के लिए परेशान करता है! संकलित आउटपुट की जांच करने के लिए – ColinE

+0

अच्छा विचार। –

0

प्रकार निष्कर्ष अपने दिए गए उदाहरण में प्रदर्शन को प्रभावित नहीं करेगा। हालांकि, मुझे पता चला कि आपके स्विफ्ट सरणी में टाइप के बारे में विशिष्ट होने से प्रदर्शन पर असर पड़ता है।

उदाहरण के लिए, नीचे दी गई विधि Any प्रकार की सरणी को घुमाती है।

class func shuffleAny(inout array: [Any]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Any = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Any = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

ऊपर समारोह वास्तव में अगर मैं इस समारोह के बजाय इस

class func shuffleIntObjects(inout array: [Int]) { 
    for (var i = 0; i < array.count; i++) { 
     let currentObject: Int = array[i] 
     let randomIndex = Int(arc4random()) % array.count 
     let randomObject: Int = array[randomIndex] 

     array[i] = randomObject; 
     array[randomIndex] = currentObject 
    } 
} 

समारोह [Any] 0.537 सेकंड 3% STDEV पर में क्लॉक का उपयोग करता है की तरह Int की एक सरणी ले बनाने के लिए थे तुलना में बहुत धीमी है 1 मिलियन Int वस्तुओं के लिए। और [Int] का उपयोग करने वाला फ़ंक्शन 0.181 सेकेंड में 2% STDEV में 1 मिलियन इंट ऑब्जेक्ट्स के लिए देखा गया।

आप इस रेपो (https://github.com/vsco/swift-benchmarks) को देख सकते हैं जो स्विफ्ट में बहुत अधिक रोचक मानदंडों का विवरण देता है। मेरे पसंदीदा लोगों में से एक यह है कि

2

मेरे अनुभव से, स्पष्ट बनाम अनुमानित प्रकारों का उपयोग करते समय संकलन गति के संदर्भ में एक बड़ा प्रदर्शन प्रभाव रहा है, स्विफ्ट जेनेरिक बहुत खराब प्रदर्शन करते हैं। मेरे धीमे संकलन कोड का बहुमत स्पष्ट रूप से टाइपिंग चर द्वारा हल किया गया है।

ऐसा लगता है जैसे स्विफ्ट कंपाइलर में अभी भी इस क्षेत्र में सुधार के लिए जगह है। अपनी कुछ परियोजनाओं को बेंचमार्क करने का प्रयास करें और आपको एक बड़ा अंतर दिखाई देगा।

यहां एक लेख है जिसे मैंने how to speed up slow Swift compile times पर लिखा था और यह पता लगाने के लिए कि इसका क्या कारण है।

संबंधित मुद्दे