2012-02-08 17 views
11

मैं कुछ लुआ स्रोत कोड देख रहा हूँ, और मैं अक्सर फ़ाइल की शुरुआत में इस तरह चीजों को देखने के:ग्लोबल लुआ स्थानीय क्यों काम करता है?

local setmetatable, getmetatable, etc.. = setmetatable, getmetatable, etc.. 

वे केवल कार्यों लुआ ताकि उन्हें आसानी से पहुंचने देने के लिए स्थानीय बनाना है जब अक्सर इस्तेमाल किया ?

+1

आप http://stackoverflow.com/questions/4643814/why-would-this-lua-optimization-hack-help –

उत्तर

12

स्थानीय डेटा ढेर पर हैं, और इसलिए वे उन्हें तेजी से एक्सेस करते हैं। हालांकि, मुझे गंभीरता से संदेह है कि setmetatable पर फ़ंक्शन कॉल समय वास्तव में कुछ प्रोग्राम के लिए एक महत्वपूर्ण मुद्दा है। वैश्विक पर्यावरण प्रदूषण से

  1. रोकथाम:

    यहाँ इस के लिए कारण हो सकते हैं। मॉड्यूल के लिए आधुनिक लुआ सम्मेलन उन्हें खुद को सीधे वैश्विक तालिका में पंजीकृत नहीं करना है। उन्हें कार्यों की एक स्थानीय तालिका बनाना चाहिए और उन्हें वापस करना चाहिए। इस प्रकार, केवल उन तक पहुंचने का तरीका स्थानीय चर के साथ है। यह कई चीजों को मजबूर करता है:

    1. एक मॉड्यूल गलती से किसी अन्य मॉड्यूल के कार्यों को ओवरराइट नहीं कर सकता है।

    2. एक मॉड्यूल गलती से ऐसा करते हैं होता है, तो तालिका में मूल कार्यों मॉड्यूल द्वारा दिया अभी भी पहुंचा जा सकेगा। केवल local modname = require "modname" का उपयोग करके आप वास्तव में और केवल उस मॉड्यूल का खुलासा करने की गारंटी देंगे।

    3. मॉड्यूल जिनमें अन्य मॉड्यूल शामिल हैं, एक दूसरे के साथ हस्तक्षेप नहीं कर सकते हैं। तालिका जो आप require से वापस प्राप्त करते हैं वह हमेशा मॉड्यूल स्टोर करता है।

  2. किसी के द्वारा एक समय से पहले अनुकूलन जो पढ़ने "local चर तेजी से एक्सेस किया जाता है" और फिर सब कुछ local बनाने का फैसला किया।

सामान्यतः, यह अच्छी प्रथा है। खैर, जब तक यह # 2 की वजह से नहीं है।

+0

पर एक नज़र डालना चाहते हैं 3. एक लिटर को सील करना जो सोचता है कि ऐसे अंतर्निर्मित कॉलिंग चूंकि कच्चे या आईपैयर खराब हैं। – andyn

0

मैं यह कर, क्योंकि यह मुझे मेरे मॉड्यूल से प्रत्येक

इसके अतिरिक्त यह वैश्विक वातावरण में काम करता है बदल रहा है दूसरों से बचाता द्वारा इस्तेमाल किया कार्यों को देखने के लिए अनुमति देता है। कि यह एक मुफ़्त (समयपूर्व) अनुकूलन एक बोनस है।

+1

आपके मॉड्यूल को उन फ़ंक्शंस का उपयोग करने से रोकने के लिए कुछ भी नहीं है जो उस सूची में नहीं हैं। इसलिए यदि आपको वैश्विक कार्य की अचानक आवश्यकता है और इसे सूची में जोड़ना भूल जाते हैं, तो आप ग्लोबल्स का उपयोग कर रहे हैं। इसके अलावा, अगर कोई वैश्विक कार्यों को बदलता है, तो संभवतः उनके लिए ऐसा करने के लिए एक * अच्छा * कारण है, जैसे कुछ कार्यों के उपयोग की निगरानी करना और आगे। –

+0

दरअसल वहां है; मेरे पास प्री-प्रतिबद्ध हुक है जो गेट्लोबल ऑपोड्स की खोज करने के लिए लुका का उपयोग करता है और मुझे चेतावनी देता है। – daurnimator

+0

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

4

निकोल Bolas के जवाब के अलावा, मैं बात करने के लिए 3 पर जोड़ेंगे:

  • जाने के बाद उसे लोड किया गया है अपने कोड एकसैंडबॉक्स के भीतर से चलाने के लिए अनुमति देता है।

यदि फ़ंक्शन को सैंडबॉक्स से बाहर रखा गया है और कोड सैंडबॉक्स के भीतर से लोड किया गया है, तो यह काम नहीं करेगा। लेकिन अगर कोड पहले भरी हुई है, सैंडबॉक्स तो भरी हुई कोड फोन और setmetatable बाहर करने के लिए, आदि, सैंडबॉक्स से सक्षम हो सकते हैं।

0

एक और सूक्ष्म लाभ: यह स्पष्ट रूप से दस्तावेज है जो चर (काम करता है, मॉड्यूल) मॉड्यूल द्वारा आयात किए जाते हैं। और अगर आप मॉड्यूल बयान का उपयोग कर रहे, यह इस तरह घोषणाओं को लागू करता है, क्योंकि वैश्विक वातावरण बदल दिया जाता है (ताकि वैश्विक उपलब्ध नहीं हैं)।

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