การใช้คุณลักษณะการดีบักจะconsole.log
ลดประสิทธิภาพการดำเนินการของ JavaScript หรือไม่ จะส่งผลต่อความเร็วของการเรียกใช้สคริปต์ในสภาพแวดล้อมการผลิตหรือไม่
มีวิธีปิดใช้งานบันทึกคอนโซลในสภาพแวดล้อมการใช้งานจริงจากตำแหน่งคอนฟิกูเรชันเดียวหรือไม่?
การใช้คุณลักษณะการดีบักจะconsole.log
ลดประสิทธิภาพการดำเนินการของ JavaScript หรือไม่ จะส่งผลต่อความเร็วของการเรียกใช้สคริปต์ในสภาพแวดล้อมการผลิตหรือไม่
มีวิธีปิดใช้งานบันทึกคอนโซลในสภาพแวดล้อมการใช้งานจริงจากตำแหน่งคอนฟิกูเรชันเดียวหรือไม่?
console.log
ใช้เวลา ~ 50ms
คำตอบ:
หากคุณกำลังจะมีสิ่งนี้ในไซต์สาธารณะหรือบางสิ่งบางอย่างใครก็ตามที่มีความรู้เพียงเล็กน้อยเกี่ยวกับการใช้เครื่องมือสำหรับนักพัฒนาสามารถอ่านข้อความแก้ไขข้อบกพร่องของคุณได้ สิ่งนี้อาจไม่ใช่พฤติกรรมที่พึงประสงค์ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณกำลังบันทึก
วิธีที่ดีที่สุดวิธีหนึ่งคือการconsole.log
รวมวิธีการใดวิธีการหนึ่งของคุณและคุณสามารถตรวจสอบเงื่อนไขและดำเนินการได้ที่ไหน ในรุ่นการผลิตคุณสามารถหลีกเลี่ยงการมีฟังก์ชันเหล่านี้ได้ นี้คำถามกองมากเกินพูดในรายละเอียดเกี่ยวกับวิธีการที่จะทำเช่นเดียวกันโดยใช้คอมไพเลอร์ปิด
ดังนั้นเพื่อตอบคำถามของคุณ:
conosle.log
เจตจำนงยังคงสร้างความนิยมให้กับฟังก์ชันที่ถูกลบล้างอยู่ใช่หรือไม่
console.log
บันทึกวัตถุจะทำให้หน่วยความจำรั่วเนื่องจากเบราว์เซอร์ยังคงรักษาโครงสร้างวัตถุไว้เพื่อให้นักพัฒนาสามารถขยายบันทึกได้
อันที่จริงconsole.log
ช้ากว่าฟังก์ชันว่างมาก การเรียกใช้การทดสอบ jsPerf นี้บน Chrome 38 ของฉันให้ผลลัพธ์ที่น่าทึ่ง:
console.log
จะช้ากว่าการเรียกฟังก์ชันว่างประมาณ 10,000 เท่าไม่ใช่ว่าคุณจะสังเกตเห็นความล่าช้าของประสิทธิภาพหากคุณมีการconsole.…
โทรจำนวนพอสมควรที่เริ่มทำงานหนึ่งครั้ง (หนึ่งร้อยจะใช้เวลา 2 มิลลิวินาทีในการติดตั้ง Chrome ของฉัน - หรือ 20 มิลลิวินาทีเมื่อคอนโซลเปิดอยู่) แต่ถ้าคุณบันทึกข้อมูลลงในคอนโซลซ้ำ ๆ เช่นการเชื่อมต่อผ่านrequestAnimationFrame
มันอาจทำให้สิ่งต่างๆยุ่งเหยิงได้
ในการทดสอบนี้ฉันได้ตรวจสอบแนวคิดของ "บันทึกที่ซ่อนอยู่" ที่กำหนดเองสำหรับการใช้งานจริงซึ่งมีตัวแปรที่เก็บข้อความบันทึกพร้อมให้บริการตามต้องการ ปรากฎว่าเป็น
console.log
,console.log
แม้ว่า ทั้งสองเป็นฟังก์ชันที่ก่อให้เกิดผลข้างเคียง
console.log
โดยตัวมันเองไม่ได้ส่งผลกระทบต่อประสิทธิภาพอย่างแท้จริงในแบบที่คุณจะสังเกตเห็นได้เว้นแต่คุณจะผูกเข้ากับตัวจัดการการเลื่อน / ปรับขนาด สิ่งเหล่านี้เรียกว่ามากและหากเบราว์เซอร์ของคุณต้องส่งข้อความไปยังคอนโซลเช่น 30 / 60x ต่อวินาทีมันอาจน่าเกลียด แล้วก็มีข้อผิดพลาดของ IE ที่ไม่อนุญาตให้คุณconsole.log
ปิดคอนโซลเลย :(
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)
const DEBUG = true / false
DEBUG && console.log('string')
หากคุณสร้างทางลัดไปยังคอนโซลในสคริปต์หลักทั่วไปเช่น:
var con = console;
จากนั้นใช้ con.log ("ข้อความ") หรือ con.error ("ข้อความแสดงข้อผิดพลาด") ตลอดทั้งรหัสของคุณในการผลิตคุณสามารถ rewire con ในตำแหน่งหลักเพื่อ:
var con = {
log: function() {},
error: function() {},
debug: function() {}
}
console.log = function(){}
การใช้คุณลักษณะการดีบัก console.log จะลดประสิทธิภาพการดำเนินการของ JavaScript หรือไม่ จะส่งผลต่อความเร็วของการเรียกใช้สคริปต์ในสภาพแวดล้อมการผลิตหรือไม่
แน่นอนว่าconsole.log()
จะลดประสิทธิภาพของโปรแกรมของคุณเนื่องจากต้องใช้เวลาในการคำนวณ
มีวิธีปิดใช้งานบันทึกคอนโซลในสภาพแวดล้อมการใช้งานจริงจากตำแหน่งคอนฟิกูเรชันเดียวหรือไม่?
ใส่รหัสนี้ที่จุดเริ่มต้นของสคริปต์ของคุณเพื่อแทนที่ฟังก์ชัน console.log มาตรฐานเป็นฟังก์ชันว่าง
console.log = function () { };
การเรียกใช้ฟังก์ชันใด ๆ จะทำให้ประสิทธิภาพลดลงเล็กน้อย แต่ไม่console.log
ควรมีผลกระทบใด ๆ
อย่างไรก็ตามมันจะทำให้เกิดข้อผิดพลาดที่ไม่ได้กำหนดในเบราว์เซอร์รุ่นเก่าที่ไม่รองรับ console
การตีประสิทธิภาพจะน้อยมากอย่างไรก็ตามในเบราว์เซอร์รุ่นเก่าจะทำให้เกิดข้อผิดพลาดของ JavaScript หากคอนโซลผู้ใช้เบราว์เซอร์ไม่ได้เปิดlog is not a function of undefined
อยู่ ซึ่งหมายความว่าโค้ด JavaScript ทั้งหมดหลังจากการเรียก console.log จะไม่ทำงาน
คุณสามารถสร้าง wrapper เพื่อตรวจสอบว่าwindow.console
เป็นอ็อบเจ็กต์ที่ถูกต้องหรือไม่จากนั้นเรียก console.log ใน wrapper สิ่งง่ายๆเช่นนี้จะได้ผล:
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/
ฉันทำการทดสอบ jsPerf นี้: http://jsperf.com/console-log1337
ดูเหมือนจะใช้เวลาไม่นานกว่าการเรียกฟังก์ชันอื่น ๆ
แล้วเบราว์เซอร์ที่ไม่มีคอนโซล API ล่ะ? หากคุณจำเป็นต้องใช้ console.log สำหรับการดีบักคุณอาจรวมสคริปต์ไว้ในการปรับใช้งานจริงของคุณเพื่อแทนที่คอนโซล API ดังที่ Paul แนะนำในคำตอบของเขา
ฉันทำวิธีนี้เพื่อรักษาลายเซ็นดั้งเดิมของวิธีคอนโซล ในตำแหน่งทั่วไปโหลดก่อน JS อื่น ๆ :
var DEBUG = false; // or true
จากนั้นตลอดรหัส
if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");