Saya sedang menguji akurasi setTimeout
menggunakan tes ini . Sekarang saya perhatikan bahwa (seperti yang diharapkan) setTimeout
tidak terlalu akurat tetapi untuk sebagian besar peralatan tidak secara dramatis tidak akurat. Sekarang jika saya menjalankan tes di Chrome dan membiarkannya berjalan di tab latar belakang (jadi, beralih ke tab lain dan jelajahi di sana), kembali ke tes dan memeriksa hasil te (jika tes selesai) mereka berubah secara dramatis. Sepertinya batas waktu berjalan lebih lambat. Diuji dalam FF4 atau IE9 ini tidak terjadi.
Jadi sepertinya Chrome menangguhkan atau setidaknya memperlambat eksekusi javascript di tab yang tidak memiliki fokus. Tidak dapat menemukan banyak di internet tentang hal ini. Itu berarti bahwa kita tidak dapat menjalankan tugas latar belakang, seperti misalnya memeriksa secara berkala pada server menggunakan panggilan XHR dan setInterval
(saya curiga melihat perilaku yang sama setInterval
, akan menulis tes jika waktunya bersama saya).
Adakah yang mengalami ini? Apakah akan ada solusi untuk suspensi ini / memperlambat? Apakah Anda menyebutnya bug dan haruskah saya mengajukannya?
sumber
transition
, jadi tidak semua transisi divs pada saat yang sama, tetapi sebenarnya 15 ms setelah satu sama lain, menciptakan beberapa efek bergulir. Ketika saya pergi ke tab lain dan kembali setelah beberapa saat, semua transisi divs pada saat yang sama dansetTimeOut
sepenuhnya diabaikan. Ini bukan masalah besar untuk proyek saya, tetapi ini adalah tambahan yang aneh dan tidak diinginkan.Jawaban:
Saya baru-baru ini bertanya tentang ini dan itu adalah perilaku dengan desain. Ketika sebuah tab tidak aktif, fungsi hanya maksimum satu kali per detik. Ini adalah perubahan kodenya .
Mungkin ini akan membantu: Bagaimana saya bisa membuat setInterval juga berfungsi ketika sebuah tab tidak aktif di Chrome?
TL; DR: gunakan Pekerja Web .
sumber
Ada solusi untuk menggunakan Pekerja Web, karena mereka berjalan dalam proses terpisah dan tidak melambat
Saya telah menulis skrip kecil yang dapat digunakan tanpa perubahan pada kode Anda - ia hanya mengabaikan fungsi setTimeout, clearTimeout, setInterval, clearInterval
Cukup sertakan sebelum semua kode Anda
http://github.com/turuslan/HackTimer
sumber
new Worker('data:text/javascript,(' + function myWorkerCode () { /*...*/ } + '()')
. Ini juga cara yang bagus untuk memeriksa apakah Anda memiliki dukungan ekspresi impor:try { eval('import("data:text/javascript,void 0")') } catch (e) { /* no support! */ }
Memainkan ~ suara kosong memaksa browser untuk mempertahankan kinerja - saya menemukannya setelah membaca komentar ini: Bagaimana cara membuat JavaScript berjalan pada kecepatan normal di Chrome bahkan ketika tab tidak aktif?
Saya membutuhkan kinerja tanpa batas sesuai permintaan untuk permainan browser yang menggunakan WebSockets, jadi saya tahu dari pengalaman bahwa menggunakan WebSockets tidak menjamin kinerja yang tidak terbatas, tetapi dari tes, memainkan file audio tampaknya memastikannya
Inilah 2 loop audio kosong yang saya buat untuk tujuan ini, Anda dapat menggunakannya secara bebas, secara komersial: http://adventure.land/sounds/loops/empty_loop_for_js_performance.ogg http://adventure.land/sounds/loops/empty_loop_for_js_performance.wav
(Termasuk kebisingan -58db, -60db tidak berfungsi)
Saya memainkannya, sesuai permintaan pengguna, dengan Howler.js: https://github.com/goldfire/howler.js
Sangat menyedihkan bahwa tidak ada metode bawaan untuk mengaktifkan / menonaktifkan kinerja javascript penuh secara default, namun, penambang crypto dapat membajak semua utas komputasi Anda menggunakan Pekerja Web tanpa ada permintaan: |
sumber
Saya telah merilis paket npm interval pekerja yang mengatur implementasi InInvalval dan ClearInterval dengan menggunakan Web-Workers untuk menjaga dan menjalankan tab yang tidak aktif untuk Chrome, Firefox, dan IE.
Sebagian besar peramban modern (Chrome, Firefox, dan IE), interval (penghitung waktu jendela) dijepit untuk mengaktifkan tidak lebih dari sekali per detik dalam tab tidak aktif.
Anda dapat menemukan informasi lebih lanjut tentang
https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers#Timeouts_and_intervals
sumber
Saya memperbarui inti jQuery saya ke 1.9.1, dan itu memecahkan perbedaan Interval di tab tidak aktif. Saya akan mencobanya terlebih dahulu, kemudian melihat ke opsi override kode lainnya.
sumber
di sini adalah solusi saya yang mendapatkan milidetik saat ini, dan membandingkannya dengan milidetik bahwa fungsi itu dibuat. untuk interval, itu akan memperbarui milidetik ketika menjalankan fungsi. Anda juga dapat mengambil interval / batas waktu dengan id.
sumber