Console.log JavaScript yürütme performansını düşürecek mi?


106

Hata ayıklama özelliğinin kullanılması console.logJavaScript yürütme performansını düşürecek mi? Üretim ortamlarında komut dosyası yürütme hızını etkileyecek mi?

Üretim ortamlarındaki konsol günlüklerini tek bir yapılandırma konumundan devre dışı bırakmaya yönelik bir yaklaşım var mı?


Şimdiye kadarki tüm yanıtlar, basitçe dizi mesajlarını çıkardığınızı varsayar. Büyük olasılıkla büyük nesne yapılarına sahip günlük nesnelerinin performansı ne olacak? örneğin console.log (largeObj)?
PandaWood

Önemli sayıda nesnenin konsola çıktı alınması, 3 saniyelik sayfa yüklemesini 30 saniyeye çevirebilir. Sadece bir örnek ...
Andrew

Basit bir console.log~ 50 ms sürer
Pedram marandi

Yanıtlar:


59

Bunu halka açık bir sitede veya başka bir yerde yapacaksanız, geliştirici araçlarını kullanma konusunda çok az bilgisi olan herkes hata ayıklama mesajlarınızı okuyabilir. Ne kaydettiğinize bağlı olarak, bu arzu edilen bir davranış olmayabilir.

En iyi yaklaşımlardan console.logbiri, yöntemlerinizden birini ve koşulları kontrol edip uygulayabileceğiniz yerlere sarmaktır. Bir üretim yapısında, bu işlevlere sahip olmaktan kaçınabilirsiniz. Bu Stack Overflow sorusu , Closure derleyicisini kullanarak aynısının nasıl yapılacağı hakkında ayrıntılı olarak konuşur .

Öyleyse, sorularınızı cevaplamak için:

  1. Evet, sadece ihmal edilebilir düzeyde olsa da hızı düşürecektir .
  2. Ancak, bir kişinin günlüklerinizi okuması çok kolay olduğu için kullanmayın.
  3. Bu sorunun yanıtları, bunları üretimden nasıl çıkaracağınız konusunda size ipuçları verebilir.

teşekkürler, ancak yine de sarmak conosle.log, geçersiz kılınan işleve hala bir vuruş yapacak değil mi?
Sudantha

15
Sadece bir not - console.logtarayıcı geliştiricilerin günlüğü genişletmesine izin vermek için nesne yapısını koruduğu için nesneleri günlüğe kaydetmek için kullanmak bellek sızıntısına neden olur.
Shamasis Bhattacharya


9
"bir kişinin günlüklerinizi okuması çok kolay" - Bu nasıl bir sorun? JavaScript, zaten kaynak koduna tam erişime sahipler!
Quentin

5
Sadece içeri girmek için: Aynı statik metinle bile console.log'u spam göndermenin (nesne veya dizi yok; kelimenin tam anlamıyla sadece console.log ('test') bunu yapacağını) da bir performans vuruşuna neden olduğunu keşfettim. Bu, yeniden işleme sırasında yüzlerce React bileşeninde çağrılan bir işlevde "çağrılan" işlevi günlüğe kaydederken dikkatimi çekti. Günlük kodunun yalnızca varlığı, sık güncellemeler sırasında çok dikkat çekici takılmalara neden oldu.
Lev

86

Aslında console.logboş bir fonksiyondan çok daha yavaştır. Bu jsPerf testini Chrome 38'imde çalıştırmak çarpıcı sonuçlar veriyor:

  • tarayıcı konsolu kapatıldığında, çağrı console.log, boş bir işlevi çağırmaktan yaklaşık 10 000 kat daha yavaştır ,
  • ve konsol açıkken, çağrı yapmak 100.000 kat daha yavaş .

Bir console.…kez tetiklenen makul sayıda arama varsa performans gecikmesini fark etmeyeceksiniz (Chrome yüklememde yüz kişi 2 ms sürer - veya konsol açıkken 20 ms sürer). Ancak konsola art arda bir requestAnimationFrameşeyler kaydederseniz - örneğin, bağlantı kurarsanız - işleri sarsabilir.

Güncelleme:

Bu testte , üretim için özel bir "gizli günlük" fikrini de kontrol ettim - istek üzerine günlük mesajlarını tutan bir değişkene sahip olmak. Olduğu ortaya çıkıyor

  • yerliden yaklaşık 1000 kat daha hızlı console.log,
  • ve kullanıcı konsolunu açık tutarsa ​​10 000 kat daha hızlı.

1
Bir derleyici boş bir fonksiyon gördüğünde, bir satırı gördüğü için hiçbir şey yürütmez, çünkü bu satırı çalıştırmak zorunda kalır. derleyici, optimizasyon olarak boş, kullanılmayan bir işlevi çalıştırmaz.
SidOfc

1
@SidneyLiebrand bilgi için teşekkürler, bilmek güzel. İkinci testin sonuçları console.logsanki aynı şekilde optimize edilebilir . Her ikisi de yan etki oluşturan işlevlerdir.
tomekwi

1
console.logtek başına, bir kaydırma / yeniden boyutlandırma işleyicisine bağlamadığınız sürece fark edeceğiniz bir şekilde performansı gerçekten etkilemez. Bunlara çok denir ve tarayıcınız konsola saniyede 30 / 60x gibi metin göndermek zorunda kalırsa çirkinleşebilir. Ve bir console.logde konsol kapalıyken hiç
sorun yaşamanıza

1
Kesinlikle haklısın - bunu cevabımda da yazdım. Genel bir kural olarak, üretim kodunda hiç konsol çağrısı olmamasına çalışıyorum. Ancak bunun nedeni performans değil - daha ziyade @Ramesh'in yazdığı gibi "bir meslekten olmayan kişinin günlüklerinizi okuması çok kolay" olduğu için.
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


11

Ortak bir çekirdek komut dosyasında konsola bir kısayol oluşturursanız, örneğin:

var con = console;

ve sonra kodunuz boyunca con.log ("message") veya con.error ("hata mesajı") kullanın, üretimde con.log ("message") veya con.error ("error message") kullanın, üretimde basitçe çekirdek konumdaki con'u aşağıdakileri yapmak için yeniden bağlayabilirsiniz:

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

16
kirli yol:console.log = function(){}
br4nnigan

10

Console.log hata ayıklama özelliğinin kullanılması JavaScript yürütme performansını düşürecek mi? Üretim ortamlarında komut dosyası yürütme hızını etkileyecek mi?

Elbette, console.log()hesaplama süresi gerektirdiğinden programınızın performansını düşürecektir.

Üretim ortamlarındaki konsol günlüklerini tek bir yapılandırma konumundan devre dışı bırakmaya yönelik bir yaklaşım var mı?

Standart console.log işlevini boş bir işlev olarak geçersiz kılmak için bu kodu komut dosyanızın başına yerleştirin.

console.log = function () { };

2
Bu, üretim ortamında konsol günlüklerini devre dışı bırakmak için en basit çözümlerden biri gibi görünüyor. Neden daha fazla ilgi görmediğini merak ediyorum! Bu boş fonksiyonun tanımını, çalıştığımız ortama (üretim veya geliştirme) bağlı olarak doğru / yanlış olarak değiştirebileceğimiz bir değişken altında kontrol edebiliriz
Anshuman Manral

2
Bu çok parlak bir cevap! Teşekkürler!
Systems Rebooter

6

Herhangi bir işlev çağrısı biraz performansı düşürecektir. Ancak birkaçının console.loggözle görülür bir etkisi olmamalıdır.

Ancak, desteklemeyen eski tarayıcılarda tanımsız hatalar atar. console


3

Performans vuruşu minimum düzeyde olacaktır, ancak eski tarayıcılarda kullanıcıların tarayıcı konsolu açık değilse JavaScript hatalarına neden olacaktır. log is not a function of undefined . Bu, console.log çağrısından sonraki tüm JavaScript kodunun çalışmayacağı anlamına gelir.

window.consoleGeçerli bir nesne olup olmadığını kontrol etmek için bir sarmalayıcı oluşturabilir ve ardından sarmalayıcıda console.log'u çağırabilirsiniz. Bunun gibi basit bir şey işe yarar:

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

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

İşte bir keman: http://jsfiddle.net/enDDV/


2

Bu jsPerf testini yaptım: http://jsperf.com/console-log1337

Diğer işlev çağrılarından daha uzun sürmüyor gibi görünüyor.

Konsol API'si olmayan tarayıcılar ne olacak? Hata ayıklama için console.log kullanmanız gerekiyorsa, Paul'ün yanıtında önerdiği gibi, konsol API'sini geçersiz kılmak için üretim dağıtımınıza bir komut dosyası ekleyebilirsiniz.


Eğer iki cevap seçebilirsem, bu en üste gidecek
Sudantha

1
Testiniz yalnızca bir console.log çağrısı eklemekle kalmaz, aynı zamanda aynı jquery işlemini iki kez yürütür. Testinizin aşağıdaki revizyonunu oluşturdum, umarım yardımcı olur: jsperf.com/console-log1337/7 Not: teşekkürler, jsperf.com'u bilmiyordum :)
dubrox

2
Aslında normal bir işlev çağrısından çok daha yavaş görünüyor. Doğrudan bir düelloda sonuçlar kıyaslanamaz: jsperf.com/console-log1337/14
tomekwi

1
Kötü cevap. Uzaktan bile doğru değil. @Tomekwi, farkın dikkat çekici olduğunu gösterdiği için oyların arttığını düşünmek. Kendim için birkaç gerçek dünya testi yaptım ve kesinlikle bir şüphe gölgesi olmadan söyleyebiliyorum konsol. Blog kesinlikle bir performans düşüşüne neden oluyor. Her saniye veya iki saniyede bir birkaç günlük, önemli bir şey değil, ancak sık sık bir şeyler günlüğe kaydedin (çerçeve güncellemelerinde, büyük bileşenlerin yeniden oluşturulmasında) ve console.log ile ve console.log olmadan fark gece ve gündüzdür.
Lev

1

Konsol yöntemlerinin orijinal imzasını korumak için bunu bu şekilde yapıyorum. Diğer JS'den önce yüklenmiş ortak bir konumda:

var DEBUG = false; // or true 

Sonra kod boyunca

if (DEBUG) console.log("message", obj, "etc");
if (DEBUG) console.warn("something is not right", obj, "etc");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.