कंसोल निष्पादन को कम करेगा जावास्क्रिप्ट निष्पादन निष्पादन?


99

डीबगिंग सुविधा का console.logउपयोग जावास्क्रिप्ट निष्पादन प्रदर्शन को कम करेगा? क्या यह उत्पादन वातावरण में स्क्रिप्ट निष्पादन की गति को प्रभावित करेगा?

क्या एकल कॉन्फ़िगरेशन स्थान से उत्पादन वातावरण में कंसोल लॉग को अक्षम करने के लिए एक दृष्टिकोण है?


सभी उत्तर, अब तक, आप बस स्ट्रिंग संदेशों को आउटपुट कर रहे हैं। संभवतः बड़े ऑब्जेक्ट संरचनाओं के साथ लॉगिंग ऑब्जेक्ट के प्रदर्शन के बारे में क्या? जैसे कंसोल.लॉग (लार्जऑबज)?
पांडावुड

सांत्वना देने के लिए वस्तुओं की महत्वपूर्ण संख्या को 3 सेकंड के पेज लोड को 30 सेकंड में बदल सकते हैं। बस एक उदाहरण ...
एंड्रयू

एक सरल console.log~ 50ms
पेडराम मरांडी

जवाबों:


55

यदि आप किसी सार्वजनिक साइट या किसी चीज़ पर ऐसा करने जा रहे हैं, तो डेवलपर टूल का उपयोग करने वाले किसी भी व्यक्ति को आपके डिबग संदेशों को पढ़ा जा सकता है। आप जो लॉग इन कर रहे हैं, उसके आधार पर, यह एक वांछनीय व्यवहार नहीं हो सकता है।

सर्वोत्तम तरीकों console.logमें से एक आपके तरीकों में से एक को लपेटना है , और जहां आप शर्तों की जांच कर सकते हैं और इसे निष्पादित कर सकते हैं। एक निर्माण बिल्ड में, आप इन कार्यों को करने से बच सकते हैं। यह स्टैक ओवरफ्लो प्रश्न विवरण में बात करता है कि क्लोजर कंपाइलर का उपयोग करके समान कैसे करें ।

तो, आपके सवालों के जवाब देने के लिए:

  1. हां, यह गति को कम करेगा, हालांकि केवल लापरवाही से।
  2. लेकिन, इसका उपयोग न करें क्योंकि किसी व्यक्ति के लिए आपके लॉग पढ़ना बहुत आसान है।
  3. इस सवाल का जवाब आपको संकेत दे सकता है कि उन्हें उत्पादन से कैसे हटाया जाए।

धन्यवाद, लेकिन अभी भी लपेटकर conosle.logअभी भी ओवरराइड फ़ंक्शन के लिए एक हिट बना देगा न?
सुदंथा

15
बस एक नोट - console.logलॉग ऑब्जेक्ट्स का उपयोग करने से मेमोरी रिसाव होता है क्योंकि ब्राउज़र ऑब्जेक्ट संरचना को लॉग का विस्तार करने की अनुमति देने के लिए बनाए रखता है।
शामसीस भट्टाचार्य


8
"किसी व्यक्ति के लिए आपके लॉग पढ़ना बहुत आसान है" - यह एक समस्या कैसे है? यह जावास्क्रिप्ट है, उनके पास पहले से ही स्रोत कोड तक पूरी पहुंच है!
क्वेंटिन

4
बस झंकार करने के लिए: मैंने बस खोज की, सांकेतिक शब्दों में बदलना। यहां तक ​​कि एक ही स्थिर पाठ (कोई वस्तु या पूर्वावलोकन) के साथ भी नहीं। शाब्दिक रूप से बस कंसोल .log ('परीक्षण') यह भी प्रदर्शन हिट का कारण बनता है। यह मेरे ध्यान में आया क्योंकि मैं एक ऐसे फ़ंक्शन के भीतर "कॉल" कर रहा था जिसे री-रेंडर करने के दौरान सैकड़ों रिएक्ट घटकों पर लगाया गया था। लॉगिंग कोड की मात्र उपस्थिति ने लगातार अपडेट के दौरान बहुत ध्यान देने योग्य हकलाना का कारण बना।
लेव

81

वास्तव में, console.logएक खाली फ़ंक्शन की तुलना में बहुत धीमा है। मेरे Chrome 38 पर यह jsPerf परीक्षण चलाना आश्चर्यजनक परिणाम देता है:

  • जब ब्राउज़र कंसोल बंद कर दिया है, बुला console.logहै 10 के बारे में 000 गुना धीमी एक खाली फ़ंक्शन को कॉल की तुलना में,
  • और जब कंसोल खुला होता है, तो उसे कॉल करना 100 000 गुना धीमा होता है

ऐसा नहीं है कि यदि आप उचित संख्या में console.…एक बार फायरिंग करते हैं, तो आप नोटिस लैग को नोटिस करेंगे (कंसोल के खुले होने पर सौ, क्रोम की मेरी स्थापना पर 2 एमएस लेगा - या 20 एमएस।)। लेकिन अगर आप बार-बार कंसोल में सामान जमा करते हैं - उदाहरण के लिए, इसे ऊपर requestAnimationFrameझुकाकर - यह चीजों को जानदार बना सकता है।

अपडेट करें:

इस परीक्षण में मैंने उत्पादन के लिए एक कस्टम "हिडन लॉग" के विचार की भी जाँच की है - एक चर जो लॉग संदेश रखता है, मांग पर उपलब्ध है। यह पता चला है

  • मूल निवासी की तुलना में लगभग 1 000 गुना तेज है console.log,
  • और जाहिर है 10 000 बार तेजी से अगर उपयोगकर्ता अपने कंसोल खुला है।

1
जब एक कंपाइलर एक खाली फ़ंक्शन देखता है, तो यह कुछ भी नहीं करता है, क्योंकि यह कार्य को चलाने के लिए एक लाइन को देखता है। संकलक एक अनुकूलन के रूप में खाली, अप्रयुक्त फ़ंक्शन को नहीं चलाता है।
सिडऑफ

1
@SidneyLiebrand जानकारी के लिए धन्यवाद, यह जानना अच्छा है। दूसरे परीक्षण के परिणामों को वैसे ही अनुकूलित किया जा सकता है console.log। ये दोनों ऐसे कार्य हैं जो दुष्प्रभाव पैदा करते हैं।
टॉमकिवी

1
console.logअपने आप में प्रदर्शन को वास्तव में इस तरह से प्रभावित नहीं करता है कि आप तब तक नोटिस करेंगे जब तक कि आप इसे स्क्रॉल / आकार बदलने वाले हैंडलर से नहीं बांधेंगे। इन्हें अलॉट कहा जाता है और यदि आपके ब्राउज़र को 30 / 60x जैसे कंसोल को पाठ भेजना है, तो यह बदसूरत हो सकता है। और फिर वहाँ IE बग है कि आप console.logसभी को सांत्वना के साथ बंद करने की अनुमति नहीं है :(
SidOfc

1
आप बिलकुल सही हैं - मैंने लिखा है कि मेरे जवाब में भी। अंगूठे के एक नियम के रूप में, मेरा प्रयास है कि उत्पादन कोड में कोई कंसोल कॉल न हो। लेकिन प्रदर्शन इसका कारण नहीं है - ऐसा इसलिए है क्योंकि "अपने लॉग्स को पढ़ने के लिए एक आम आदमी के लिए बहुत आसान है" जैसा @Ramesh ने लिखा है।
टॉमक्वी

1
logging-on x 3,179 ops/sec ±2.07% (56 runs sampled) logging-off x 56,058,330 ops/sec ±2.87% (56 runs sampled) logging-off-stringify x 1,812,379 ops/sec ±3.50% (58 runs sampled) log-nothing x 59,509,998 ops/sec ±2.63% (59 runs sampled)
केसी


10

यदि आप कॉमन कोर स्क्रिप्ट में कंसोल का शॉर्टकट बनाते हैं, जैसे:

var con = console;

और फिर अपने कोड के दौरान con.log ("संदेश") या con.error ("त्रुटि संदेश") का उपयोग करें, उत्पादन पर आप मुख्य स्थान में con को केवल rewire कर सकते हैं:

var con = {
    log: function() {},
    error: function() {},
    debug: function() {}
}

16
गंदा तरीका:console.log = function(){}
br4nnigan

8

डिबगिंग सुविधा कंसोल का उपयोग करेगा। जावास्क्रिप्ट निष्पादन निष्पादन को कम करेगा? क्या यह उत्पादन वातावरण में स्क्रिप्ट निष्पादन की गति को प्रभावित करेगा?

बेशक, console.log()आपके कार्यक्रम के प्रदर्शन को कम कर देगा क्योंकि यह कम्प्यूटेशनल समय लेता है।

क्या एकल कॉन्फ़िगरेशन स्थान से उत्पादन वातावरण में कंसोल लॉग को अक्षम करने के लिए एक दृष्टिकोण है?

इस कोड को अपनी स्क्रिप्ट की शुरुआत में एक खाली समारोह में मानक कंसोल.लॉग फ़ंक्शन को ओवरराइड करने के लिए रखें।

console.log = function () { };

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

2
यह इतना शानदार जवाब है! धन्यवाद!
सिस्टम रीबूटर

6

कोई भी फ़ंक्शन कॉल प्रदर्शन को थोड़ा कम करेगा । लेकिन कुछ लोगों console.logको कोई ध्यान देने योग्य प्रभाव नहीं होना चाहिए।

हालांकि यह पुराने ब्राउज़रों में अपरिभाषित त्रुटियों को फेंक देगा जो समर्थन नहीं करते हैं console


3

प्रदर्शन हिट न्यूनतम होगा, हालांकि पुराने ब्राउज़रों में यह जावास्क्रिप्ट त्रुटियों का कारण होगा यदि उपयोगकर्ता ब्राउज़र कंसोल नहीं खुला है log is not a function of undefined। इसका अर्थ है कि कंसोल.लॉग कॉल के बाद सभी जावास्क्रिप्ट कोड निष्पादित नहीं होंगे।

आप window.consoleएक वैध वस्तु है या नहीं, यह जांचने के लिए आप रैपर बना सकते हैं , और उसके बाद रैपर में कंसोल.लॉग कर सकते हैं। इस तरह कुछ सरल काम करेगा:

window.log = (function(console) {
    var canLog = !!console;
    return function(txt) {
        if(canLog) console.log('log: ' + txt);
    };
})(window.console);

log('my message'); //log: my message

यहाँ एक पहेली है: http://jsfiddle.net/enDDV/


2

मैंने यह jsPerf परीक्षण किया: http://jsperf.com/console-log1337

यह अन्य फ़ंक्शन कॉल की तुलना में अधिक समय तक नहीं लगता है।

उन ब्राउज़रों के बारे में क्या जिनके पास कंसोल API नहीं है? यदि आपको डीबगिंग के लिए कंसोल.लॉग का उपयोग करने की आवश्यकता है, तो आप कंसोल एपीआई को ओवरराइड करने के लिए अपने उत्पादन परिनियोजन में एक स्क्रिप्ट शामिल कर सकते हैं, जैसे पॉल उनके जवाब में सुझाव देता है।


अगर मैं दो उत्तरों का चयन कर सकता हूं तो यह शीर्ष पर जाएगा
सुदंथा

1
आपका परीक्षण न केवल एक कंसोल.लॉग कॉल जोड़ता है, बल्कि एक ही jquery ऑपरेशन को दो बार निष्पादित करता है। मैंने आपके परीक्षण का निम्नलिखित संशोधन बनाया है, आशा है कि यह मदद करता है: jsperf.com/console-log1337/7 PS: धन्यवाद, मुझे jsperf.com के बारे में पता नहीं था :)
dubrox

2
यह वास्तव में एक सामान्य फ़ंक्शन कॉल की तुलना में बहुत धीमा प्रतीत होता है। प्रत्यक्ष द्वंद्वयुद्ध में परिणाम अतुलनीय हैं: jsperf.com/console-log1337/14
tomekwi

1
बुरा जवाब। दूर से भी सही नहीं। @Tomekwi के रूप में इच्छाधारी सोच-विचार अंतर दर्शाता है उल्लेखनीय है। मैंने स्वयं कई वास्तविक विश्व परीक्षण किए हैं और बिना किसी संदेह के एक छाया के बिना कह सकते हैं सांत्वना सांत्वना।लॉग निश्चित रूप से एक प्रदर्शन हिट का कारण बनता है। कुछ सेकंड यहाँ और वहाँ हर दूसरे या दो, कोई बड़ी बात नहीं है, लेकिन अक्सर कुछ लॉग करें (फ्रेम अपडेट पर, बड़े पैमाने पर घटकों के पुन: रेंडरर्स) और कंसोल के साथ और बिना अंतर रात और दिन है।
लेव

1

मैं इसे सांत्वना विधियों के मूल हस्ताक्षर को बनाए रखने के लिए करता हूं। सामान्य स्थान पर, किसी भी अन्य JS से पहले लोड किया गया:

var DEBUG = false; // or true 

फिर पूरे कोड में

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.