Console.log có làm giảm hiệu suất thực thi JavaScript không?


99

Việc sử dụng tính năng gỡ lỗi có console.loglàm giảm hiệu suất thực thi JavaScript không? Nó sẽ ảnh hưởng đến tốc độ thực thi tập lệnh trong môi trường sản xuất?

Có cách nào để tắt nhật ký bảng điều khiển trong môi trường sản xuất từ ​​một vị trí cấu hình duy nhất không?


Tất cả các câu trả lời, cho đến nay, giả sử bạn chỉ đơn giản là xuất ra các thông điệp chuỗi. Điều gì về hiệu suất của các đối tượng ghi nhật ký, với các cấu trúc đối tượng có thể lớn? ví dụ: console.log (LargeObj)?
PandaWood

Xuất một số lượng đáng kể các đối tượng vào bảng điều khiển có thể biến 3 giây tải trang thành 30 giây. Chỉ là một ví dụ ...
Andrew

Một đơn giản console.logmất ~ 50ms
Pedram marandi

Câu trả lời:


55

Nếu bạn sắp có điều này trên một trang web công cộng hoặc một cái gì đó, bất kỳ ai có ít kiến ​​thức về cách sử dụng các công cụ dành cho nhà phát triển đều có thể đọc thông báo gỡ lỗi của bạn. Tùy thuộc vào những gì bạn đang ghi, đây có thể không phải là một hành vi mong muốn.

Một trong những cách tiếp cận tốt nhất là kết hợp console.logmột trong các phương pháp của bạn và nơi bạn có thể kiểm tra các điều kiện và thực thi nó. Trong một phiên bản sản xuất, bạn có thể tránh có những chức năng này. Đây câu hỏi Stack Overflow nói chi tiết về làm thế nào để làm điều tương tự bằng cách sử dụng trình biên dịch Đóng cửa .

Vì vậy, để trả lời câu hỏi của bạn:

  1. Có, nó sẽ làm giảm tốc độ, mặc dù chỉ đáng kể.
  2. Tuy nhiên, đừng sử dụng nó vì quá dễ dàng để một người đọc nhật ký của bạn.
  3. Câu trả lời cho câu hỏi này có thể cung cấp cho bạn gợi ý về cách loại bỏ chúng khỏi sản xuất.

cảm ơn nhưng vẫn bao bọc ý conosle.logchí vẫn tạo ra một cú đánh vào chức năng bị ghi đè phải không?
Sudantha

15
Chỉ cần một lưu ý - việc sử dụng console.logđể ghi các đối tượng sẽ gây ra rò rỉ bộ nhớ vì trình duyệt giữ lại cấu trúc đối tượng để cho phép các nhà phát triển mở rộng nhật ký.
Shamasis Bhattacharya


8
"Quá dễ dàng để một người đọc nhật ký của bạn" - Đây là vấn đề như thế nào? Đó là JavaScript, họ đã có toàn quyền truy cập vào mã nguồn!
Quentin

4
Chỉ để kêu gọi: Tôi vừa phát hiện ra, việc gửi spam console.log ngay cả với cùng một văn bản tĩnh (không có đối tượng hoặc mảng; nghĩa đen là chỉ console.log ('test') sẽ làm điều đó) cũng gây ra lỗi hiệu suất. Điều này thu hút sự chú ý của tôi khi tôi đang ghi nhật ký "được gọi" trong một hàm được gọi trên hàng trăm thành phần React trong quá trình kết xuất. Sự hiện diện đơn thuần của mã ghi nhật ký đã gây ra tình trạng giật hình rất đáng chú ý trong quá trình cập nhật thường xuyên.
Lev

80

Trên thực tế, console.logchậm hơn rất nhiều so với một hàm rỗng. Chạy thử nghiệm jsPerf này trên Chrome 38 của tôi cho kết quả tuyệt vời:

  • khi trình duyệt giao diện điều khiển được đóng lại, gọi console.logchậm hơn khoảng 10 000 lần vì gọi một chức năng rỗng,
  • khi giao diện điều khiển đang mở, việc gọi nó chậm hơn 100 000 lần .

Không phải là bạn sẽ nhận thấy độ trễ hiệu suất nếu bạn có một số lượng hợp lý console.…cuộc gọi kích hoạt một lần (một trăm sẽ mất 2 mili giây khi tôi cài đặt Chrome - hoặc 20 mili giây khi mở bảng điều khiển). Nhưng nếu bạn đăng nhập nhiều lần nội dung vào bảng điều khiển - chẳng hạn như nối nó qua requestAnimationFrame- nó có thể khiến mọi thứ trở nên lộn xộn.

Cập nhật:

Trong thử nghiệm này, tôi cũng đã kiểm tra ý tưởng về một “nhật ký ẩn” tùy chỉnh để sản xuất - có một biến chứa các thông báo nhật ký, có sẵn theo yêu cầu. Hóa ra là

  • nhanh hơn khoảng 1000 lần so với bản gốc console.log,
  • và rõ ràng là nhanh hơn 10 000 lần nếu người dùng mở bảng điều khiển của mình.

1
Khi một trình biên dịch thấy một hàm trống, nó sẽ thực thi không có gì ướt hơn vì nó nhìn thấy một dòng để thực thi nó sẽ phải chạy hàm. trình biên dịch chỉ đơn giản là không chạy một chức năng trống, không được sử dụng như một chức năng tối ưu hóa.
SidOfc

1
@SidneyLiebrand cảm ơn vì thông tin, thật tốt khi biết. Kết quả của thử nghiệm thứ hai có thể được tối ưu hóa theo cách tương tự như console.logvậy. Cả hai đều là những chức năng tạo ra tác dụng phụ.
tomekwi

1
console.logtự nó không thực sự tác động đến hiệu suất theo cách mà bạn sẽ nhận thấy trừ khi bạn liên kết nó với trình xử lý cuộn / thay đổi kích thước. Chúng được gọi là rất nhiều và nếu trình duyệt của bạn phải gửi văn bản đến bảng điều khiển như 30 / 60x một giây, nó có thể trở nên xấu xí. Và sau đó có mà IE lỗi mà không cho phép bạn có console.loglà gì cả với giao diện điều khiển đóng :(
SidOfc

1
Bạn hoàn toàn đúng - tôi cũng đã viết điều đó trong câu trả lời của mình. Theo nguyên tắc chung, tôi cố gắng không có lệnh gọi bảng điều khiển nào trong mã sản xuất. Nhưng hiệu suất không phải là lý do - đó là bởi vì "quá dễ dàng để một người dân đọc nhật ký của bạn" như @Ramesh đã viết.
tomekwi

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)
casey


10

Nếu bạn tạo một lối tắt đến bảng điều khiển trong một tập lệnh cốt lõi chung, ví dụ:

var con = console;

và sau đó sử dụng con.log ("thông báo") hoặc con.error ("thông báo lỗi") trong suốt mã của bạn, trong quá trình sản xuất, bạn có thể chỉ cần cuộn lại con ở vị trí cốt lõi để:

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

16
cách bẩn:console.log = function(){}
br4nnigan

8

Việc sử dụng tính năng gỡ lỗi console.log có làm giảm hiệu suất thực thi JavaScript không? Nó sẽ ảnh hưởng đến tốc độ thực thi tập lệnh trong môi trường sản xuất?

Tất nhiên, console.log()sẽ làm giảm hiệu suất chương trình của bạn vì nó cần thời gian tính toán.

Có cách nào để tắt nhật ký bảng điều khiển trong môi trường sản xuất từ ​​một vị trí cấu hình duy nhất không?

Đặt mã này ở đầu tập lệnh của bạn để ghi đè hàm console.log chuẩn thành một hàm trống.

console.log = function () { };

2
Đây dường như là một trong những giải pháp đơn giản nhất để tắt nhật ký bảng điều khiển trong môi trường sản xuất. Tự hỏi tại sao nó không có nhiều chú ý hơn! Chúng tôi có thể kiểm soát các định nghĩa hàm rỗng này theo một biến mà chúng tôi có thể chuyển đổi như đúng / sai tùy thuộc vào môi trường chúng ta đang làm việc trên (prod hoặc dev)
Anshuman Manral

2
Đây là một câu trả lời tuyệt vời! Cảm ơn!
Systems Rebooter

6

Bất kỳ lệnh gọi hàm nào sẽ làm giảm hiệu suất một chút . Nhưng một số ít console.logsẽ không có bất kỳ ảnh hưởng đáng chú ý nào.

Tuy nhiên, nó sẽ tạo ra các lỗi không xác định trong các trình duyệt cũ hơn không hỗ trợ console


3

Hiệu suất sẽ là tối thiểu, tuy nhiên trong các trình duyệt cũ hơn, nó sẽ gây ra lỗi JavaScript nếu bảng điều khiển trình duyệt của người dùng không mở log is not a function of undefined. Điều này có nghĩa là tất cả mã JavaScript sau lệnh gọi console.log sẽ không thực thi.

Bạn có thể tạo một trình bao bọc để kiểm tra xem có phải window.consolelà một đối tượng hợp lệ hay không, rồi gọi console.log trong trình bao bọc. Một cái gì đó đơn giản như thế này sẽ hoạt động:

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

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

Đây là một fiddle: http://jsfiddle.net/enDDV/


2

Tôi đã thực hiện kiểm tra jsPerf này: http://jsperf.com/console-log1337

Nó dường như không mất nhiều thời gian hơn các lệnh gọi hàm khác.

Điều gì về các trình duyệt không có API bảng điều khiển? Nếu bạn cần sử dụng console.log để gỡ lỗi, bạn có thể bao gồm một tập lệnh trong triển khai sản xuất của mình để ghi đè API console, giống như Paul gợi ý trong câu trả lời của anh ấy.


nếu tôi có thể chọn hai câu trả lời này sẽ được chuyển tới đầu
Sudantha

1
Thử nghiệm của bạn không chỉ thêm một lệnh gọi console.log mà còn thực hiện cùng một hoạt động jquery hai lần. Tôi đã tạo bản sửa đổi sau cho bài kiểm tra của bạn, hy vọng nó sẽ hữu ích: jsperf.com/console-log1337/7 Tái bút : cảm ơn, tôi không biết về jsperf.com :)
dubrox

2
Nó thực sự có vẻ chậm hơn rất nhiều so với một cuộc gọi hàm bình thường. Trong một trận đấu trực tiếp kết quả là có một không hai: jsperf.com/console-log1337/14
tomekwi

1
Câu trả lời không hay. Thậm chí không chính xác từ xa. Số phiếu ủng hộ đáng mơ ước khi @tomekwi thể hiện sự khác biệt là đáng chú ý. Tôi đã tự mình thực hiện một số bài kiểm tra trong thế giới thực và hoàn toàn có thể nói rằng không có nghi ngờ gì về việc gửi thư rác console.log chắc chắn gây ra một cú đánh hiệu suất. Một vài bản ghi ở đây và ở đó mỗi giây hoặc hai giây, không có vấn đề gì lớn, nhưng hãy ghi lại điều gì đó thường xuyên (cập nhật khung hình, kết xuất các thành phần lớn) và sự khác biệt giữa và không có console.log là đêm và ngày.
Lev

0

Tôi làm theo cách này để duy trì chữ ký ban đầu của các phương thức bảng điều khiển. Ở một vị trí chung, được tải trước bất kỳ JS nào khác:

var DEBUG = false; // or true 

Sau đó trong suốt mã

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.