optimizasyonu kapatabilir miyim, böylece kapaklardaki kapsam içi değişkenler "optimize edilmedi"


11

Modern tarayıcılar tarafından yapılan kod optimizasyonunun bir yan ürünü olarak, hata ayıklama sırasında, "gerçekte" kapsam dahilindeki tüm değişkenleri "göremezsiniz". Bu iyi bilinmektedir ve burada SO ile ilgili bir önceki soruda ele alınmıştır . Bu özellik, üretimde kesinlikle yararlı olsa da, geliştirme sırasında beni çok rahatsız ediyor olsa da, beni yavaşlatıyor (bu açık olmalı).

Şimdi sorum şu, bu davranışı kapatmanın bir yolu var mı? Bazı yapılandırma dosyasını düzenleyebilir miyim, yoksa bir tarayıcı eklentisi var mı, ya da tarayıcı yürütülebilir dosyasının "geliştiriciler için özel bir derleme sürümü" olabilir mi? Yeni kod yazarken kodumu hemen konsola yazmayı seviyorum, bu yüzden bu gerçekten beni rahatsız ediyor.

visualSummaryIffalseConsoleLog

GÜNCELLEME / DÜZENLE

İşte kısmi bir çözüm, Paul1365972'ye kredi.

Krom tarayıcıyı komut satırından, aşağıdaki gibi özel seçeneklerle başlatmanız gerekir:

  1. Chrome'u tamamen kapatın
  2. Chrome'u "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" diğer işletim sistemlerine benzer pencereler için konsoldan çalıştırın .
  3. Geliştirici konsolunu açın ve çalıştırın "%GetHeapUsage()". Chrome'u seçenekle düzgün bir şekilde başlattıysanız, konsola bir sayı kaydedilir, aksi takdirde bir sözdizimi hatası alırsınız.

Bu komut satırı işaretiyle, %düz JavaScript'teki sözdizimi hataları olan komutlarla 'V8 ile konuşabilirsiniz' . Paul'un cevabında bu tür mevcut V8 komutlarının bir listesi verildi .

Orada %NeverOptimizeFunction()sadece aramak ve onunla yapılabilir olurdu şey gibi görünüyordu şey olduğunu listede bulunuyordu. Ne yazık ki, bu işlev bir sonraki ekran görüntüsünde gösterildiği gibi umduğum şeyi yapmıyor.

lorem hala tanımlanmadı

((( Paul'un cevabındaki diğer bağlantı (v8-natives düğüm modülü) bu bağlamda bizim için önemli değildir. Tek yaptığı şey, kodları çökmemesi için "%" işlev çağrılarının etrafına tek satırları sarmaktır. v8 olmayan tarayıcılar.)))

(((Bunun işe yaradığı bir zamanı hatırlıyorum (bu optimizasyon henüz icat edilmediğinde / uygulanmadığında). Ne kadar zaman önce bilmiyorum. On yıl? 15 yıl? Böyle bir şey. Son Chrome sürümü (eğer herhangi bir) ve yapabileceğiniz son firefox sürümü (burada var olduğundan daha fazla emin olun) size ödül getirmeyecek, ancak bir cevap olarak biliyor ve gönderirseniz size bir oylama alacaktır. .)))

ÇÖZÜM

TEŞEKKÜR EDERİZ PETR SRNICEK

hacky fix

YENİ SORU

Petr'ın çözümü çok yardımcı olsa da, mükemmel değil. Bu soru çok uzun sürüyor, bu yüzden Petr'in çözümünün nasıl geliştirilebileceğine dair yeni bir soru yayınladım . (Tabii ki bu soruyu burada düzenleyebilirim, ama ne demek istediğimi biliyorsanız, bu "tarihsiz" olurdu.)


istenmeyen sonuçlar, onbeşinci bölüm. bu optimizasyonun kodlama tarzım üzerinde olumsuz bir etkisi var. Ben kendimi eski moda döngü (.map, .forEach, .reduce yerine) aksi takdirde yapacağımdan daha fazla kullanarak, sadece bu yüzden bu sorunla kaçınmak.
mathheadinclouds

v8-nativesKütüphane sadece olmalı, basit bir kütüphanede kodunda önemli% çağrıları sarar noops.. özel --allow-yerliler-sözdizimi bayrak başladı olmayan bir tarayıcı veya düğümünde
Natanel'i

Bazı testler yaptım, 'bodyOnLoad' fonksiyonu zaten optimize edilmedi; bu yüzden dahili komutları kullanarak optimizasyonu kaldırmaya zorlamak hiçbir şey yapmaz.
Nathanael

@Nathanael: Önemli çağrı, %NeverOptimizeFunction(foo)sadece bodyOnload için de aradım, "çünkü", "iyi düşünmek, acıtmayacak". Sorun, fooumduğum şekilde deoptimize DEĞİLDİR. Değişken loremgörünmezdir. Diyelim ki foo fonksiyonuna girecek bazı kodları yazmak istiyorum. Metin düzenleyicime yazmak yerine, dev konsoluna yazıyorum (hata ayıklayıcı foodayken), istediğimi yapıp yapmadığını görün ve sonra kopyalayıp konsoldan metin düzenleyicime yapıştırın. Bu şekilde çalışmayı seviyorum. Ve yapamazlar. Optimizasyon yüzünden. Anla?
mathheadinclouds

1
Paul1365972 yanıtını göndermeden önce birkaç bizimkini çeşitli --js-flags(birkaç TurboFan ile ilgili olanlar da dahil ) ve birkaç V8 yerel komutunu deneyerek geçirdim, ancak istenen davranışı başaramadım. Bu yaklaşımın çıkmaz bir nokta olabileceğine inanıyorum. [v8]Bu soruya bir etiket eklemek faydalı olabilir . V8'in iç işleyişini derinlemesine anlayan biri, bunun doğru yol olup olmadığını veya belki de sizi doğru yöne yönlendirdiğini açıklığa kavuşturabilir.
Petr Srníček

Yanıtlar:


2

Böyle bir eval ayıklayıcı deyimi sarma bütün değişkenler erişebilirsiniz: eval("debugger;");. Bu hacky çözümü, çağrı yığınına başka bir anonim işlev ekler ve DevTools'ta manuel olarak ayarlanan kesme noktaları için hiçbir faydası yoktur.

Bu çok iyi bir çözüm gibi görünmüyor, ancak şimdiye kadar amaçlanan davranışı gerçekleştiren tek kişi olduğu için, bir cevap olarak gönderiyorum.


bunun işe yaraması beni şaşırtıyor. Bilirsiniz, eval ("lorem") yazmayı denedim ve aynı "lorem tanımlı değil" hatası verdi. Konsolda eval ("lorem") yazmanın (foo işlevindeki hata ayıklayıcı deyimindeyken), eval ("debugger") 'dan farklı bir şey yapması gerektiğini düşünmüyorum - bekle, "ipsum" yazdır konsol. Ama çok farklılar. Garip.
mathheadinclouds

Bu ilginç bir çalışma. Bu hata ayıklama deyimi (sadece el ile kaynak dosyaya geçmek zorunda) dışarı adım olamaz gibi biraz kötü, aksi takdirde tüm yığını kaybeder ve eval olarak adlandırılan işleve geri; azaltılmış yığını diğer bağlamda eksik bırakır.
Nathanael

kişi bu hileyi şu şekilde değiştirebilir: eval ("debugger") yerine, sadece eval ("") koyun - ancak birçoğu, kodun her tarafına dağıtılmış, 'genişletilmiş kesme noktası' isteyebileceğinizi düşündüğünüz her yere. Daha sonra bu eval ('') ifadelerinden birinin olduğu bir kesme noktası (dev araçlarıyla) ayarlayabilirsiniz ve orada durduktan sonra "adımla" yaparsınız. Her ifadenin başında bu ifadeleri koyarak küçük bir transpiler (yaptığım küçük bir şey için büyük bir kelime) yazmayı düşünüyorum. stackoverflow.com/questions/59159996/…
mathheadinclouds

Sadece eval ("debugger") eval () ile değiştirmeyi denedim; hata ayıklayıcı ve firefox veya chrome kullanımına bağlı olarak farklı sonuçlar elde etti. i.stack.imgur.com/wy5WT.png
mathheadinclouds

3

Google Chrome V8 JS-Engine kullanıyor, --allow-natives-sözdizimi bayrağıyla yerel çağrıları etkinleştirebilirsiniz; bu , aradığınız gibi birçok yararlı hata ayıklama işlevini ( burada tam liste ) gösterir:% NeverOptimizeFunction () . Bu bayrak olmadan, bu çağrılar yasadışı sözdizimi olacaktır, bu yüzden dağıtırken dikkatli olun (veya v8-Natives kütüphanesini kullanın).

Bu özelliği etkinleştirmek için --js-flags = "- allow-natives-syntax" ile kromu açın (yalnızca güvenilir web sitelerinin hata ayıklaması için bunu kullanın, çünkü bu gerçekten istemediğiniz şeylere güvenilmeyen js kodu erişimi verebilir izni var).


teşekkür ederim. Lütfen güncellenmiş sorumu okuyun. Çözümün burada olması muhtemel görünüyor, ancak devam ettirmek için biraz daha açıklamaya ihtiyacım var. Bu işe yararsa, ödülü hak ettiniz.
mathheadinclouds

tl; dr bunun yerine --js-flags = "- allow-natives-sözdizimini kullan". Özelliği etkinleştirmek için V8 JS-Engine'in --allow-natives-sözdizimi bayrağıyla başlatılması gerekir, ancak doğrudan başlatamazsınız, bu krom işi. Bu yüzden kroma motoru bayrakla çalıştırmasını söylemelisiniz, bunu nasıl yapıyorsunuz? Bahsedilen motor bayrağını --js-flags = <bayrağınız> aracılığıyla kroma geçirmeniz yeterlidir.
Paul1365972

Hayır. Sadece bir kez daha denedim, güvenli taraf olmak için. Hem çalıştılar --allow-natives-syntaxve --js-flags="--allow-natives-syntax""işletim sistemi konsolunda 'krom' sonra şey tipi" olarak birden çok kez. Eğer bunu kendim denemeseydim, ben de bir yazım hatası olduğunu düşünüyorum. Başka bir ekran görüntüsü yaptım. i.stack.imgur.com/7cpPP.png Yazım hatası mı gördünüz ? Lütfen bana dürüst bir cevap verin: sadece "makaleyi okudunuz ve anladınız mı?" (Açık olmak gerekirse, bununla ilgili yanlış bir şey yok, daha fazla iddia etmiyorsanız) veya makinenizdeki tüm bunları gerçekten denediniz mi? thx
mathheadinclouds

sadece bir tahmin: Bu seçenek ile krom çalıştırılabilir başlatmak değil , ama bu seçenek ile krom C ++ (ya da her neyse) kaynakları derlemek olabilir ?
mathheadinclouds

1
Bu garip ben sadece test ve iyi çalıştı, derleme gerekli. Tam olarak ne yaptığımı yazacağım, bu yüzden yanlış anlama yok. 1. Chrome'u tamamen kapatın 2. Chrome'u konsoldan "C: / Program Files (x86) /Google/Chrome/Application/chrome.exe" --js-flags = "- allow-natives-sözdizimi" ile çalıştırın. 3. Aç geliştirici konsolu ve her şeyin çalışıp çalışmadığını test etmek için "% GetHeapUsage ()" komutunu yürütün
Paul1365972

0

Umarım bu sorunun GERÇEK bir cevabı vardır. Takip eden gerçek bir cevap değil, geçici. if (false) { console.log(variables, from, closures); }Statik analizi kullanarak formun aptal yardımcı kodunu oluşturabileceğiniz bir yardımcı araç yazdım (söz konusu ekran görüntüsüne bakın) - kodunuzu yapıştırın, aptal ifade oluşturulur, kopyalayabilirsiniz, sonra ihtiyacınız yoktur yazmak için. Tüm bu kopyalama ve yapıştırma işlemleri de zaman aldığından bunun çok yardımcı olup olmadığını bilmiyorum, ama elimde olan bu.

ekran görüntüsü

Vaktini boşa harcamak

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.