แท็บพื้นหลังใน Chrome 57

แท็บที่ทำงานอยู่เบื้องหลังอาจส่งผลเสียอย่างมากต่อประสิทธิภาพของเบราว์เซอร์ โดยเฉพาะอายุการใช้งานแบตเตอรี่ เพื่อช่วยลดปัญหานี้ 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 เช่น การเรียกใช้ชุดทดสอบและการประมวลผลที่หนักหน่วงอื่นๆ ที่ผู้ใช้อนุญาต