แท็บที่ทำงานอยู่เบื้องหลังอาจส่งผลเสียอย่างมากต่อประสิทธิภาพของเบราว์เซอร์ โดยเฉพาะอายุการใช้งานแบตเตอรี่ เพื่อช่วยลดปัญหานี้ Chrome ได้ออกข้อจำกัดต่างๆ เกี่ยวกับแท็บในเบื้องหลังตลอดหลายปีที่ผ่านมา เมื่อเร็วๆ นี้ เราได้พยายามปรับปรุงเพิ่มเติมหลายอย่าง และเอกสารนี้จะกล่าวถึงภาพรวมของนโยบาย Chrome เอกสารนี้มุ่งเน้นที่การอธิบายนโยบายปัจจุบันใน Chrome 57 ดูกลยุทธ์ระยะยาวและแผนอื่นๆ ได้ในเอกสารนี้
การเพิ่มประสิทธิภาพแอปพลิเคชันสำหรับเบื้องหลัง
นักพัฒนาเว็บควรทราบว่าผู้ใช้มักจะเปิดแท็บไว้หลายแท็บในเบื้องหลัง ซึ่งอาจส่งผลร้ายแรงต่อการใช้พลังงานและอายุการใช้งานแบตเตอรี่ การทำงานในเบื้องหลังควรมีให้น้อยที่สุด เว้นแต่จำเป็นอย่างยิ่งเพื่อให้ผู้ใช้ได้รับประสบการณ์การใช้งานบางอย่าง ควรใช้ API ระดับการเข้าถึงหน้าเว็บเพื่อตรวจจับเมื่อมีหน้าเว็บอยู่ในเบื้องหลังและระงับการทำงานที่ไม่จำเป็นทั้งหมด เช่น การอัปเดตภาพ
สำหรับบางเว็บไซต์ การเพิ่มประสิทธิภาพง่ายๆ นี้สามารถลดการใช้งาน CPU ได้มากถึง 75%
var doVisualUpdates = true;
document.addEventListener('visibilitychange', function(){
doVisualUpdates = !document.hidden;
});
function update() {
if (!doVisualUpdates) {
return;
}
doStuff();
}
นโยบาย
requestAnimationFrame()
ตามเอกสารประกอบ Chrome จะไม่เรียกใช้ requestAnimationFrame()
เมื่อหน้าเว็บทำงานอยู่เบื้องหลัง
ลักษณะการทำงานนี้มีมาตั้งแต่ปี 2011
การปรับแนวตัวจับเวลาในเบื้องหลัง
ตั้งแต่ Chrome 11 เป็นต้นไป ระบบจะเรียกใช้ตัวจับเวลาอิสระแต่ละรายการไม่เกิน 1 ครั้งต่อวินาที Chrome จะเรียกใช้ตัวจับเวลาเหล่านี้เป็นกลุ่มละครั้ง เพื่อให้แน่ใจว่ามีการเก็บจำนวนการปลุกระบบของกระบวนการให้น้อยที่สุด หน้าเว็บที่เล่นเสียงได้จะถือว่าผู้ใช้มองเห็นได้ และได้รับการยกเว้นจากการควบคุมตัวจับเวลาในเบื้องหลัง การยกเว้นจะมีผลเป็นเวลาหลายวินาทีหลังจากที่เสียงหยุดเล่นเพื่อให้แอปพลิเคชันจัดคิวแทร็กเสียงถัดไป
โปรดทราบว่าระบบจะถือว่ามีเสียงก็ต่อเมื่อ Chrome แสดงไอคอน "เสียง" เท่านั้น สตรีมเสียงที่ไม่มีเสียงจะไม่ได้รับการยกเว้น
การควบคุมตัวจับเวลาเบื้องหลังตามงบประมาณ
มีให้บริการใน Chrome 57 การจำกัดตัวจับเวลาตามงบประมาณเป็นกลไกเพิ่มเติมในการปรับเวลาตัวจับเวลา ซึ่งจะจำกัดการใช้งาน CPU ของตัวจับเวลาเบื้องหลังเพิ่มเติม โดยวิธีทํางานมีดังนี้
- แท็บเบื้องหลังแต่ละแท็บมีงบประมาณเวลา (เป็นวินาที) สำหรับตัวจับเวลาทำงานอยู่เบื้องหลัง
- หน้าเว็บมีข้อจำกัดด้านเวลาสำหรับงบประมาณหลังจากผ่านไปแล้ว 10 วินาทีในพื้นหลัง
- ระบบจะอนุญาตให้งานตัวจับเวลาทํางานก็ต่อเมื่องบประมาณเวลาเป็นค่าบวกเท่านั้น
- หลังจากที่ตัวจับเวลาดำเนินการแล้ว ระบบจะนำเวลาเรียกใช้ออกจากงบประมาณ
- งบประมาณจะสร้างขึ้นใหม่อย่างต่อเนื่องตามเวลา (ปัจจุบันตั้งค่าไว้ที่อัตรา 0.01 วินาทีต่อวินาที) โปรดทราบว่าอัตราการสร้างงบประมาณใหม่นี้สามารถปรับแต่งได้เมื่อ Chrome รวบรวมข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการจำกัด
การจำกัดนี้มีข้อยกเว้นอัตโนมัติหลายประการ ดังนี้
- แอปพลิเคชันที่เล่นเสียงจะถือว่าอยู่เบื้องหน้าและจะไม่ถูกจำกัด
- แอปพลิเคชันที่มีการเชื่อมต่อแบบเรียลไทม์ (WebSockets และ WebRTC) เพื่อหลีกเลี่ยงการปิดการเชื่อมต่อเหล่านี้เนื่องจากหมดเวลา กฎการจับเวลา 1 ครั้งจะยังคงมีผลในกรณีเหล่านี้
โปรดทราบว่ากลไกนี้ใช้เวลาจริง ไม่ใช่เวลา CPU ซึ่งก็เป็นเวลาโดยประมาณของ CPU ที่เหมาะสมและบทลงโทษในการบล็อกเทรดหลักเป็นเวลานาน
สุดท้าย โปรดทราบว่าหากคุณใช้งานที่ใช้เวลานานในเบื้องหลัง แอปพลิเคชันอาจถูกจำกัดเป็นเวลานานมาก (นานกว่าระยะเวลาของงานถึง 100 เท่า)
แบ่งงานออกเป็นกลุ่มๆ ละไม่เกิน 50 มิลลิวินาทีตามหลักเกณฑ์ด้านประสิทธิภาพ และใช้สไลเทนเนอร์ visibilityChange
เพื่อหลีกเลี่ยงการทำงานที่ไม่จำเป็นในเบื้องหลัง
การเลือกไม่ใช้
Chrome มี Flag --disable-background-timer-throttling
สำหรับ Use Case เช่น การเรียกใช้ชุดทดสอบและการประมวลผลที่หนักหน่วงอื่นๆ ที่ผู้ใช้อนุญาต