क्या मैं ऑप्टिमाइज़ेशन बंद कर सकता हूं, इसलिए क्लोज़र से स्कोप वाले वैरिएबल "ऑप्टिमाइज़ आउट" नहीं हैं


11

डिबगिंग करते समय, आधुनिक ब्राउज़रों द्वारा किए गए कोड अनुकूलन के बायप्रोडक्ट के रूप में, आप "सभी चर" जो "तथ्यात्मक" दायरे में नहीं देख सकते हैं। यह सर्वविदित है और एसओ पर यहां एक पिछले प्रश्न में संबोधित किया गया है । यह विशेषता, जबकि उत्पादन में सबसे निश्चित रूप से उपयोगी मुझे विकास के दौरान बहुत परेशान कर रहा है, यह मुझे धीमा कर देता है (यह स्पष्ट होना चाहिए।)

अब मेरा प्रश्न यह है कि क्या इस व्यवहार को बंद करने का कोई तरीका है? क्या मैं कुछ कॉन्फ़िगरेशन फ़ाइल संपादित कर सकता हूं, या क्या कोई ब्राउज़र प्लगइन है, या हो सकता है कि ब्राउज़र निष्पादन योग्य "डेवलपर्स के लिए विशेष बिल्ड संस्करण" है? जब मैं नया कोड लिख रहा होता हूं, तो मैं तुरंत सांत्वना में अपना कोड लिखना पसंद करता हूं, इसलिए यह वास्तव में मेरे लिए बुरा है।

visualSummaryIffalseConsoleLog

अद्यतन / संपादित करें

यहाँ एक आंशिक समाधान है, जिसका श्रेय Paul1365972 को जाता है।

आपको कमांड लाइन से क्रोम ब्राउज़र शुरू करना होगा, विशेष विकल्पों के साथ, जैसे:

  1. क्रोम को पूरी तरह से बंद कर दें
  2. Chrome को कंसोल से चलाएं "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" जो विंडोज़ के समान ओएस के लिए है।
  3. डेवलपर कंसोल खोलें और निष्पादित करें "%GetHeapUsage()"। यदि आपने Chrome को विकल्प के साथ ठीक से प्रारंभ किया है, तो एक नंबर कंसोल में लॉग इन किया जाएगा, अन्यथा आपको सिंटैक्स त्रुटि मिलेगी।

इस कमांड लाइन के झंडे के साथ, आप 'V8' इंजन के साथ बात कर सकते %हैं, जो कमांड के साथ शुरू होता है , जो सादे जावास्क्रिप्ट में वाक्यविन्यास त्रुटियां हैं। पॉल के जवाब में इस तरह के उपलब्ध V8 कमांड की एक सूची दी गई थी ।

नहीं है %NeverOptimizeFunction()कि सूची है, जो कुछ जो बात मैं सिर्फ कॉल करने के लिए और इसके साथ किया जाना होगा की तरह दिखाई देता है पर। दुर्भाग्य से, वह फ़ंक्शन वह नहीं करता है जिसकी मुझे उम्मीद थी, जैसा कि अगले स्क्रीनशॉट में दिखाया गया है।

लोरेम को अभी भी परिभाषित नहीं किया गया है

(( पॉल के उत्तर से अन्य लिंक (v8-natives नोड मॉड्यूल) का इस संदर्भ में हमारे लिए कोई महत्व नहीं है। यह सब यह है कि यह "%" फ़ंक्शन कॉल के चारों ओर एक-लाइनर को लपेटता है ताकि कोड न हो। जो ब्राउज़र v8 नहीं हैं।)))

((मुझे एक समय याद है जब यह काम किया था (जब इस अनुकूलन का आविष्कार नहीं किया गया था / अभी तक लागू नहीं हुआ है)। मुझे नहीं पता कि कब तक। दस साल? 15 साल? कुछ ऐसा ही। पिछले क्रोम संस्करण क्या था (यदि कोई भी) और अंतिम फ़ायरफ़ॉक्स संस्करण क्या था (अधिक यकीन है कि यहां मौजूद है) जहां आप कर सकते हैं; यह आपको इनाम नहीं मिलेगा, लेकिन यह आपको एक उत्थान मिलेगा, यदि आप इसे जानते हैं और इसे उत्तर के रूप में पोस्ट करते हैं ।)))

समाधान

आप पेट्री SRNICEK धन्यवाद

हैकी फिक्स

नया प्रश्न

जबकि पेट्र का समाधान बहुत मदद करता है, यह सही नहीं है। यह सवाल बहुत लंबा हो रहा है, इसलिए मैंने एक नया सवाल पोस्ट किया कि पेट्र के समाधान को कैसे बेहतर बनाया जा सकता है। (मैं निश्चित रूप से इस प्रश्न को यहाँ संपादित कर सकता हूं, लेकिन यह "अनहैतिहासिक" महसूस होगा, यदि आप जानते हैं कि मेरे पास क्या अर्थ है।


अनपेक्षित परिणाम, अध्याय दशमांश। इस अनुकूलन का मेरी कोडिंग शैली पर नकारात्मक प्रभाव पड़ा है। मैं अपने आप को लूप के लिए पुराने जमाने के प्रयोग के बजाय पाता हूं। (के बजाय .forEach, .reduce) की तुलना में अधिक अन्यथा मैं करूंगा, बस इसलिए मैं इस मुद्दे पर चलने से बचता हूं।
मैथेडिनक्लाउड्स

v8-nativesपुस्तकालय सिर्फ एक सरल पुस्तकालय में कोड में महत्वपूर्ण% कॉल कि होना चाहिए लपेटता noopsएक ब्राउज़र या नोड जो विशेष --allow-मूल निवासी-वाक्य रचना ध्वज में शुरू नहीं किया गया था में ..
नतनएल

मैंने कुछ परीक्षण किए, 'bodyOnLoad' फ़ंक्शन को वैसे भी अनुकूलित नहीं किया गया है; इसलिए इंटर्नल कमांड का उपयोग करके इसे डी-ऑप्टिमाइज़ करने के लिए मजबूर करने के लिए कुछ भी नहीं करता है।
नथनैल

@ नथनेल: महत्वपूर्ण कॉल %NeverOptimizeFunction(foo)मुझे सिर्फ बॉडीऑन लोड के लिए कहा जाता है, "सिर्फ इसलिए", "अच्छी तरह से सोचकर, यह दुख होगा"। मुद्दा यह है कि fooजिस तरह से मैं उम्मीद कर रहा था उस तरह से इसे नहीं अपनाया गया है। चर loremअदृश्य है। मान लीजिए कि मैं कुछ कोड लिखना चाहता हूं जो फ़ंक्शन फू में जाना है। इसे अपने टेक्स्ट एडिटर में टाइप करने के बजाय, मैं इसे देव कंसोल में टाइप करता हूं (जबकि डिबगर फू पर बैठा है), यह देखें कि क्या यह वही है जो मैं चाहता हूं, और फिर इसे कंसोल से अपने टेक्स्ट एडिटर पर कॉपी / पेस्ट करें। यही कारण है कि मुझे काम करना पसंद है। और नहीं कर सकते। अनुकूलन के कारण। उसे ले लो?
मैथेडिनक्लाउड्स

1
मैंने विभिन्न --js-flags(कई टर्बो- संबंधित लोगों सहित ) के साथ प्रयोग करने के साथ-साथ पॉल 1365972 से पहले कई वी 8 देशी आदेशों के साथ अपने जवाब पोस्ट किए, लेकिन मैंने वांछित व्यवहार को प्राप्त करने में सक्षम नहीं था। मेरा मानना ​​है कि यह दृष्टिकोण एक मृत अंत हो सकता है। [v8]इस प्रश्न के लिए एक टैग जोड़ना सार्थक हो सकता है । V8 के आंतरिक कामकाज की गहरी समझ रखने वाला कोई व्यक्ति यह स्पष्ट करने में सक्षम हो सकता है कि क्या यह रास्ता है या शायद आपको सही दिशा में इंगित करता है।
पेट्र सीनिकेक

जवाबों:


2

आप इस तरह की एक eval में डिबगर बयान लपेटकर द्वारा सभी चर तक पहुँच प्राप्त कर सकते हैं: eval("debugger;");। यह हैकी समाधान हालांकि कॉल स्टैक में एक और अनाम फ़ंक्शन जोड़ता है और यह स्पष्ट रूप से ब्रेकपॉइंट्स के लिए कोई उपयोग नहीं है जो मैन्युअल रूप से DevTools में सेट किए गए हैं।

यह एक बहुत अच्छा समाधान नहीं लगता है, लेकिन चूंकि यह एकमात्र ऐसा है जो अभी तक इच्छित व्यवहार को प्राप्त करता है, इसलिए मैं इसे उत्तर के रूप में पोस्ट कर रहा हूं।


यह मुझे आश्चर्यचकित करता है कि यह काम करता है। आप जानते हैं, मैंने eval ("lorem") टाइप करने की कोशिश की, और उसी "lorem को परिभाषित नहीं किया गया" त्रुटि दी। यह मेरे लिए बहुत मायने नहीं रखता है कि कंसोल पर एवलिंग ("लोरेम") (जबकि फंक्शन फू में डिबगर स्टेटमेंट पर) इवेल ("डीबगर") से कुछ भी अलग करना चाहिए - उम्मीद कर रहा है, "थिप्सम" प्रिंट करें सांत्वना देने के लिए। लेकिन वे बहुत अलग हैं। अजीब।
मैथेडिनक्लाउड्स

यह एक दिलचस्प काम है। यह थोड़ा हैक्य है, क्योंकि आप डिबगर स्टेटमेंट से बाहर नहीं जा सकते (आपको बस मैन्युअल फ़ाइल पर स्विच करना होगा) अन्यथा आप पूरे स्टैक को खो देते हैं और उस फ़ंक्शन पर वापस लौट जाते हैं जिसे eval कहा जाता है; आपको छोड़ दिया गया स्टैक अन्य संदर्भ को याद कर रहा है।
नतनएल

कोई भी इस ट्रिक को संशोधित कर सकता है: eval ("डीबगर") के बजाय, केवल eval ("") डालें - लेकिन उनमें से कई, सभी कोड पर वितरित किए जाते हैं, हर जगह जहां आपको लगता है कि आप 'विस्तारित विराम बिंदु' चाहते हैं। फिर आप एक ब्रेकपॉइंट (देव टूल्स के साथ) सेट कर सकते हैं, जहाँ उन में से एक ('') स्टेटमेंट है, और एक बार जब आप वहाँ रुक जाते हैं, तो आप "स्टेप इन" करते हैं। मैं प्रत्येक फ़ंक्शन की शुरुआत में उन बयानों को डालते हुए थोड़ा ट्रांसपिलर (एक छोटी सी बात के लिए बड़ा शब्द) लिख रहा हूं। stackoverflow.com/questions/59159996/…
mathheadinclouds

मैंने अभी-अभी eval ("debugger") को eval () से बदलने की कोशिश की; डिबगर, और फ़ायरफ़ॉक्स या क्रोम के उपयोग के आधार पर अलग-अलग परिणाम मिले। i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome, V8 JS-Engine का उपयोग करता है, आप इसे -ऑल-नेटिव-सिंटैक्स फ़्लैग के साथ देशी कॉल सक्षम कर सकते हैं, यह कई उपयोगी डिबगिंग फ़ंक्शंस (पूरी सूची यहां ) को उजागर करता है, जैसे आप देख रहे हैं:% NeverOptimizeFunction () । इस झंडे के बिना, ये कॉल अवैध रूप से वाक्यविन्यास होंगे ताकि तैनाती के समय सावधान रहें (या v8- मूल निवासी पुस्तकालय का उपयोग करें )।

इस सुविधा को सक्षम करने के लिए --js- झंडे = "- अनुमति-मूल-वाक्यविन्यास" के साथ क्रोम खोलें का उपयोग कर सकते हैं)।


धन्यवाद। कृपया मेरा अद्यतन प्रश्न पढ़ें। ऐसा लगता है कि आपको यहां समाधान मिल गया है, लेकिन मुझे इसे प्राप्त करने के लिए कुछ और स्पष्टीकरण की आवश्यकता है। यदि यह काम करता है, तो आप निश्चित रूप से इनाम के लायक हैं।
मैथेडिनक्लाउड्स

tl; डॉ। उपयोग --js-flag = "- allow-natives-syntax" के बजाय। सुविधा को सक्षम करने के लिए V8 JS-Engine को --allow-natives-syntax ध्वज के साथ शुरू करने की आवश्यकता है, हालांकि आप इसे सीधे शुरू नहीं कर सकते हैं, यह गुणन कार्य है। तो आपको झंडे के साथ इंजन शुरू करने के लिए क्रोम को बताना होगा, आप ऐसा कैसे करते हैं? जज-झंडे के माध्यम से उल्लेखित इंजन झंडे को पास करें = <अपने झंडे को> क्रोम में।
पॉल १३६५

नहीं। बस कोशिश की है कि एक बार, एक सुरक्षित पक्ष बनने के लिए। मैंने दोनों --allow-natives-syntaxऔर --js-flags="--allow-natives-syntax"कई बार कोशिश की है "ऑपरेटिंग सिस्टम कंसोल में 'क्रोम' के बाद मैं जिस चीज को टाइप करता हूं"। अगर मैंने यह सब अपने आप नहीं किया, तो मुझे भी लगता है कि एक टाइपो सबसे अधिक संभावना है। मैंने एक और स्क्रीनशॉट बनाया। i.stack.imgur.com/7cpPP.png एक टाइपो देखें? कृपया मुझे एक ईमानदार उत्तर दें: क्या आपने अभी "लेख पढ़ा और समझा है" (स्पष्ट होने के लिए, इसके साथ कुछ भी गलत नहीं है, यदि आप अधिक दावा नहीं करते हैं), या क्या आपने वास्तव में अपनी मशीन पर यह सब करने की कोशिश की है? thx
मैथेडिनक्लाउड्स

बस एक अनुमान: यह हो सकता है कि मैं उस विकल्प के साथ क्रोम निष्पादन योग्य शुरू नहीं करता हूं , लेकिन मैं उस विकल्प के साथ क्रोम सी ++ (या जो भी) स्रोतों को संकलित करता हूं ?
मैथेडिनक्लाउड्स

1
अजीब बात है कि मैं सिर्फ यह परीक्षण किया है और यह ठीक काम किया, कोई संकलन की जरूरत है। मैं सिर्फ वही लिखूंगा जो मैंने किया था इसलिए कोई गलतफहमी नहीं है। 1. क्रोम को पूरी तरह से बंद कर दें। क्रोम को "C: / Program Files (x86) /Google/Chrome/Application/chrome.exe" --js-flag = "- allow-natives-syntax" 3. ओपन के साथ कंसोल से चलाएँ। डेवलपर कंसोल और "सब कुछ काम कर रहा है" का परीक्षण करने के लिए "% GetHeapUsage ()" निष्पादित करें
Paul1365972

0

मैं वास्तव में आशा करता हूं कि इस प्रश्न का वास्तविक उत्तर है। निम्नलिखित एक वास्तविक जवाब नहीं है, यह एक अस्थायी है। मैंने एक सहायक उपकरण लिखा है जिसके साथ आप if (false) { console.log(variables, from, closures); }स्थैतिक विश्लेषण का उपयोग करके फॉर्म का बेवकूफ सहायक कोड बना सकते हैं (स्क्रीन शॉट देखें) इसे टाइप करने के लिए। मुझे नहीं पता कि यह बहुत मदद करता है, क्योंकि यह सब नकल और चिपकाने में भी समय लगता है, लेकिन मुझे यही मिला है।

स्क्रीनशॉट

बेला

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.