কনসোল.লগ জাভাস্ক্রিপ্ট কার্যকরকরণের কার্যকারিতা হ্রাস করবে?


105

ডিবাগিং বৈশিষ্ট্যটির ব্যবহার console.logজাভাস্ক্রিপ্ট কার্যকরকরণের কার্যকারিতা হ্রাস করবে? এটি উত্পাদন পরিবেশে স্ক্রিপ্ট কার্যকরকরণের গতিকে প্রভাবিত করবে?

একটি কনফিগারেশন অবস্থান থেকে উত্পাদন পরিবেশে কনসোল লগ নিষ্ক্রিয় করার জন্য কি কোনও দৃষ্টিভঙ্গি রয়েছে?


সমস্ত উত্তর, এখনও অবধি, ধরে নিন যে আপনি কেবল স্ট্রিং বার্তা আউটপুট করছেন। লগিং অবজেক্টের কার্যকারিতা সম্পর্কে, সম্ভবত বড় অবজেক্ট স্ট্রাকচারের কী? যেমন কনসোল.লগ (লার্জবজ)?
পান্ডাওয়ুড

কনসোলে উল্লেখযোগ্য সংখ্যক অবজেক্ট আউটপুট করা 3 সেকেন্ডের পৃষ্ঠা লোডকে 30 সেকেন্ডে পরিণত করতে পারে। একটি উদাহরণ ...
অ্যান্ড্রু

একটি সরল console.logtakes 50ms লাগে
পেড্রাম মারান্ডি

উত্তর:


57

আপনি যদি কোনও পাবলিক সাইটে বা অন্য কিছুতে রাখতে যাচ্ছেন তবে বিকাশকারী সরঞ্জামগুলি ব্যবহারের বিষয়ে অল্প জ্ঞানের সাথে আপনার ডিবাগ বার্তাগুলি পড়তে পারবেন। আপনি লগইন করছেন তার উপর নির্ভর করে, এটি পছন্দসই আচরণ নাও হতে পারে।

সেরা পদ্ধতির একটি হ'ল আপনার কোনও console.logএকটি পদ্ধতিতে মোড়ানো এবং যেখানে আপনি শর্তাদি পরীক্ষা করে এটি সম্পাদন করতে পারেন। প্রোডাকশন বিল্ডে আপনি এই কাজগুলি এড়াতে পারবেন। এই স্ট্যাক ওভারফ্লো প্রশ্নটি ক্লোজার সংকলক ব্যবহার করে একই কীভাবে করা যায় সে সম্পর্কে বিশদ আলোচনা করে ।

সুতরাং, আপনার প্রশ্নের উত্তর দিতে:

  1. হ্যাঁ, এটি গতি কমিয়ে দেবে, যদিও কেবল তুচ্ছভাবে।
  2. তবে, এটি ব্যবহার করবেন না কারণ কোনও ব্যক্তির পক্ষে আপনার লগগুলি পড়া খুব সহজ।
  3. উত্তর এই প্রশ্ন আপনার উপর ইঙ্গিত তাদের উৎপাদন থেকে অপসারণ করার জন্য কিভাবে দিতে পারে।

ধন্যবাদ তবে এখনও মোড়ানো conosle.logকি ওভাররাইড করা ফাংশনে হিট করবে?
সুদান্থ

15
ঠিক একটি নোট - console.logলগ অবজেক্টগুলিতে ব্যবহারের ফলে মেমোরি ফাঁস হয় কারণ ব্রাউজারটি বিকাশকারীদের লগটি প্রসারিত করার জন্য অবজেক্টের কাঠামোটিকে ধরে রাখে।
শামাসিস ভট্টাচার্য


9
"আপনার লগগুলি পড়া কোনও ব্যক্তির পক্ষে খুব সহজ" - এটি কীভাবে সমস্যা? এটি জাভাস্ক্রিপ্ট, তাদের ইতিমধ্যে সোর্স কোডে সম্পূর্ণ অ্যাক্সেস রয়েছে!
কোয়ান্টিন

4
শুধু চিম ইন করতে: আমি সন্ধান করেছি, একই স্ট্যাটিক পাঠ্য (কোনও বস্তু বা অ্যারে; আক্ষরিকভাবে কেবল কনসোল.লগ ('পরীক্ষা') এটি করবে না) দিয়েও কনসোল.লগকে স্প্যামিং করায় পারফরম্যান্স হিট হয়। এটি আমার নজরে এলো যখন আমি একটি ফাংশনটির মধ্যে "ডাকা" লগ করছি যা পুনরায় রেন্ডারগুলির সময় শত প্রতিক্রিয়াশীল উপাদানগুলিতে আহ্বান করা হয়েছিল। লগিং কোডের নিছক উপস্থিতি ঘন ঘন আপডেটের সময় খুব লক্ষণীয় তোড়জোড় করে।
লেভ

84

আসলে, console.logএকটি খালি ফাংশন চেয়ে অনেক ধীর। চলমান এই jsPerf পরীক্ষা আমার Chrome 38 অত্যাশ্চর্য ফলাফল দেয়:

  • যখন ব্রাউজার কনসোল বন্ধ করা হবে, কলিং console.logহয় 10 সম্পর্কে 000 বার ধীর একটি খালি ফাংশন কলিং পরিবর্তে,
  • এবং যখন কনসোলটি খোলা থাকে, এটিকে কল করা 100 000 গুণ হিসাবে ধীর হয়

আপনার যদি যুক্তিসঙ্গত সংখ্যার সংখ্যা থাকে তবে আপনি পারফরম্যান্স পিছনে লক্ষ্য করবেন না console.… একবার কল ফায়ারিং হয় (একশো আমার ক্রোমের ইনস্টল করতে 2 এমএস লাগবে - বা কনসোলটি খোলা থাকলে 20 এমএস)। তবে আপনি যদি কনসোলে বারবার স্টাফ লগ করেন - উদাহরণস্বরূপ, এটির মাধ্যমে requestAnimationFrameঝুঁকছেন - এটি জিনিসগুলিকে ঝাঁকুনিতে ফেলতে পারে।

হালনাগাদ:

এই পরীক্ষায় আমি উত্পাদনের জন্য একটি কাস্টম "লুকানো লগ" ধারণাটিও দেখেছি - চাহিদা অনুসারে লগ মেসেজ ধারণকারী একটি ভেরিয়েবল থাকা। এটি পরিণত হয়

  • প্রায় 1 000 বারনেটিভ তুলনায় দ্রুত console.log,
  • এবং স্পষ্টতই 10,000 গুণ বেশি দ্রুত যদি ব্যবহারকারীর তার কনসোল খোলা থাকে।

4
যখন একটি সংকলক একটি খালি ফাংশন দেখে, এটি কার্যকরীভাবে কোনও কাজই চালায় না কারণ এটি সঞ্চালনের জন্য একটি লাইন দেখে ফাংশনটি চালাতে হবে। সংকলক কেবল অপ্টিমাইজেশন হিসাবে একটি খালি, অব্যবহৃত ফাংশন চালায় না।
সিডওএফসি

4
@ সিডনিলিবার্ড এই তথ্যের জন্য ধন্যবাদ, এটি জানতে পেরে ভাল। দ্বিতীয় পরীক্ষার ফলাফলগুলি যেমন ঠিক তেমনই অনুকূলিত করা যায় console.log। উভয়ই ফাংশন যা পার্শ্ব প্রতিক্রিয়া তৈরি করে।
টমেকিবি

4
console.logনিজেই কার্য সম্পাদনকে এমনভাবে প্রভাবিত করে না যে আপনি খেয়াল করবেন না যদি না আপনি এটিকে কোনও স্ক্রল / আকার পরিবর্তন হ্যান্ডলারের সাথে আবদ্ধ করেন। এগুলিকে অলট বলা হয় এবং যদি আপনার ব্রাউজারটি 30 / 60x সেকেন্ডের মতো কনসোলে পাঠাতে হয় তবে এটি কুশ্রী হতে পারে। এবং তারপরে আইই বাগটি রয়েছে যা আপনাকে console.logকনসোলটি বন্ধ করে
দেওয়ার অনুমতি দেয়নি

4
আপনি একেবারে ঠিক বলেছেন - আমি আমার উত্তরে এটিও লিখেছি। থাম্বের নিয়ম হিসাবে, আমি প্রযোজনা কোডে কোনও কনসোল কল না দেওয়ার চেষ্টা করি। তবে কার্য সম্পাদন কারণ নয় - এটি বরং কারণ @ রামেশ লিখেছেন যে "একজন সাধারণ লোকের পক্ষে আপনার লগগুলি পড়া খুব সহজ"।
টমেকিবি

4
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)
কেসি


11

আপনি যদি একটি সাধারণ কোর স্ক্রিপ্টে কনসোলের শর্টকাট তৈরি করেন, যেমন:

var con = console;

এবং তারপরে আপনার কোড জুড়ে কন.লগ ("বার্তা") বা কন.আরার ("ত্রুটি বার্তা") ব্যবহার করুন, উত্পাদনের সময় আপনি কেবলমাত্র মূল স্থানে কন পুনরায় লাগাতে পারেন:

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

16
নোংরা উপায়:console.log = function(){}
br4nnigan

8

ডিবাগিং বৈশিষ্ট্য কনসোল.লগ ব্যবহার জাভাস্ক্রিপ্ট কার্যকর করার কর্মক্ষমতা হ্রাস করবে? এটি উত্পাদন পরিবেশে স্ক্রিপ্ট কার্যকরকরণের গতিকে প্রভাবিত করবে?

অবশ্যই console.log()এটি কম্পিউটারের সময় নেয় বলে আপনার প্রোগ্রামের কর্মক্ষমতা হ্রাস করবে।

একটি কনফিগারেশন অবস্থান থেকে উত্পাদন পরিবেশে কনসোল লগ নিষ্ক্রিয় করার জন্য কি কোনও দৃষ্টিভঙ্গি রয়েছে?

আপনার স্ক্রিপ্টের শুরুতে এই কোডটি একটি খালি ফাংশনে মানক কনসোল.লগ ফাংশনকে ওভাররাইড করার জন্য রাখুন।

console.log = function () { };

4
এটি উত্পাদন পরিবেশে কনসোল লগ অক্ষম করার অন্যতম সহজ সমাধান বলে মনে হয়। ভাবছেন কেন এর বেশি মনোযোগ নেই! আমরা এই খালি ফাংশনটির সংজ্ঞাটি একটি চলকের অধীনে নিয়ন্ত্রণ করতে পারি যা আমরা কোন পরিবেশের উপর নির্ভরশীল (প্রড বা দেব) এর উপর নির্ভর করে সত্য / মিথ্যা হিসাবে টগল করতে পারি
অঙ্কুশান ম্যানরাল

4
এটি এমন উজ্জ্বল উত্তর! ধন্যবাদ!
সিস্টেমগুলি রিবুটার

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

আমি এই jscreen পরীক্ষা করেছি: http://jsperf.com/console-log1337

এটি অন্য ফাংশন কলগুলির চেয়ে বেশি সময় নেয় বলে মনে হয় না।

কনসোল এপিআই নেই এমন ব্রাউজারগুলির সম্পর্কে কী? আপনার যদি ডিবাগিংয়ের জন্য কনসোল.লগ ব্যবহার করার প্রয়োজন হয় তবে কনসোল এপিআই ওভাররাইড করতে আপনার উত্পাদন স্থাপনার একটি স্ক্রিপ্ট অন্তর্ভুক্ত থাকতে পারে, যেমন পল তার উত্তরে পরামর্শ দেয়।


যদি আমি দুটি উত্তর নির্বাচন করতে পারি তবে এটি শীর্ষে যাবে
সুদান্থ

4
আপনার পরীক্ষাটি কেবল একটি কনসোল.লগ কল যোগ করে না, একই বার দু'বার একই jquery অপারেশন চালায়। আমি আপনার পরীক্ষার নিম্নলিখিত সংশোধন তৈরি করেছি, আশা করি এটি সাহায্য করবে: jsperf.com/console-log1337/7 পিএস: ধন্যবাদ, আমি jsperf.com সম্পর্কে জানতাম না :)
ডাব্রক্স

4
এটি আসলে সাধারণ ফাংশন কলের চেয়ে অনেক ধীর বলে মনে হয়। প্রত্যক্ষ দ্বন্দ্বের ফলাফলগুলি অতুলনীয়: jsperf.com/console-log1337/14
টমেকভি

4
খারাপ উত্তর। দূরবর্তী দিক থেকেও সঠিক নয়। @ টমেকভি যেভাবে পার্থক্যটি উল্লেখযোগ্য তা দেখায় ইচ্ছামত চিন্তা-ভাবনা করছে up আমি বেশ কয়েকটি বাস্তব বিশ্বের পরীক্ষা করেছি এবং একেবারে কোনও সন্দেহের ছায়া ছাড়াই বলতে পারি স্প্যামিং কনসোল.লগ অবশ্যই পারফরম্যান্স হিটের কারণ হয়ে দাঁড়ায়। এখানে প্রতি কয়েক বা দ্বিতীয় কয়েক লগ, কোনও বড় কথা নয়, তবে ঘন ঘন কিছু লগ করুন (ফ্রেম আপডেটে, বিশাল উপাদানগুলির পুনরায় রেন্ডার করে) এবং কনসোল.লগের সাথে এবং ছাড়া পার্থক্যটি রাত ও দিন।
লেভ

1

কনসোল পদ্ধতির মূল স্বাক্ষর বজায় রাখার জন্য আমি এটি এইভাবে করি। একটি সাধারণ স্থানে, অন্য কোনও জেএসের আগে লোড করা:

var DEBUG = false; // or true 

তারপর কোড জুড়ে

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.