เลย์เอาต์ของ Flexbox ไม่ช้า

พอล ไอริช

เมื่อสักครู่ Wilson Page ได้เขียนบทความดีๆ สำหรับ Smashing Magazine เกี่ยวกับวิธีทำให้เว็บแอป Financial Times กลายเป็นจริง ในบทความนี้ Wilson ได้อธิบายว่า

เมื่อแอปเริ่มเติบโตขึ้น เราพบว่าประสิทธิภาพการทำงานแย่ลงเรื่อยๆ

เราใช้เวลา 2-3 ชั่วโมงในไทม์ไลน์ของเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome และพบสาเหตุของปัญหา ความน่าสยดสยอง! ซึ่งเป็นเพื่อนใหม่ของเราที่ชื่อ Flexbox ไทม์ไลน์แสดงให้เห็นว่าบางเลย์เอาต์ใช้เวลาเกือบ 100 มิลลิวินาที การปรับเลย์เอาต์ของเราใหม่โดยไม่ใช้ Flexbox ก็ลดเหลือ 10 มิลลิวินาที

ความคิดเห็นของ Wilson เกี่ยวกับ Flexbox รุ่นเดิม (เดิม) ที่ใช้ display: box; ขออภัยที่พวกเขาไม่มีโอกาสตอบคำถามว่า Flexbox ที่ใหม่กว่า (display: flex;) เร็วกว่าหรือไม่ แต่พอใช้คำสั่ง CSS แล้ว Chris Coyier ก็เปิดคำถามนั้น

เราได้ถาม Ojan Vafai ที่เขียนเรื่องการติดตั้งใช้งานส่วนใหญ่ใน WebKit และ Blink เกี่ยวกับโมเดลและการติดตั้งใช้งาน Flexbox ที่ใหม่กว่า

โค้ด Flexbox ใหม่มี Codepath แบบมัลติพาสน้อยกว่ามาก แต่คุณจะยังกดโค้ดเส้นทางหลายพาสได้ค่อนข้างง่าย (เช่น flex-align: stretch มักจะเป็น 2-Pass) โดยทั่วไปแล้ว การดำเนินการดังกล่าวควรจะเร็วกว่ากรณีทั่วไปมาก แต่คุณจะสร้างกรณีที่ทำได้ช้าเท่าๆ กันก็ได้

อย่างไรก็ตาม หากคุณสามารถหนีปัญหาเหล่านี้ไปได้ เลย์เอาต์แบบบล็อกปกติ (ไม่ลอย) มักจะเร็วหรือเร็วกว่า Flexbox ใหม่เนื่องจากเป็นแบบ Single Pass เสมอ แต่ Flexbox ใหม่ควรเร็วกว่าการใช้ตารางหรือเขียนโค้ดเลย์เอาต์ JS-base แบบกำหนดเอง

ผมได้เปรียบเทียบไวยากรณ์แบบเก่ากับใหม่ เพื่อให้เห็นความแตกต่างระหว่างตัวเลข

การเปรียบเทียบเดิมกับ Flexbox ใหม่

  • old Flexbox กับ Flexbox ใหม่ (มีสำรอง)
  • 500 องค์ประกอบต่อหน้า
  • การประเมินต้นทุนในการโหลดหน้าเว็บเพื่อออกแบบองค์ประกอบ
  • เฉลี่ยจากการเรียกใช้แต่ละครั้ง 3 ครั้ง
  • วัดบนเดสก์ท็อป (อุปกรณ์เคลื่อนที่จะทำงานช้าลงประมาณ 10 เท่า)

เฟล็กซ์บ็อกซ์เดิม: ค่าใช้จ่ายสำหรับเลย์เอาต์ ~43.5 มิลลิวินาที


ตัวอย่างเลย์เอาต์ Flexbox แบบเก่า

Flexbox ใหม่: ต้นทุนเลย์เอาต์ ~18.2 มิลลิวินาที


ตัวอย่างเลย์เอาต์ Flexbox ใหม่

สรุป: เก่าช้ากว่าใหม่ 2.3 เท่า

คุณควรทำอย่างไร

เมื่อใช้ Flexbox ให้เขียนสิ่งใหม่ๆ เสมอ: ไวยากรณ์ IE10 สำหรับ Tweener และ Flexbox ที่อัปเดตใหม่ซึ่งอยู่ใน Chrome 21+, Safari 7+, Firefox 22+, Opera (& Opera Mobile) 12.1+, IE 11+ และ Blackberry 10+ ซึ่งในหลายๆ กรณี คุณสามารถเลือกใช้ Flexbox เบราว์เซอร์รุ่นเก่ากว่าได้ในบางกรณี

ข้อควรจำ: เครื่องมือ ไม่ใช่กฎ

แต่สิ่งที่สำคัญกว่านั้นคือการเพิ่มประสิทธิภาพสิ่งที่สำคัญ ใช้ไทม์ไลน์เพื่อระบุจุดคอขวดของคุณก่อนที่จะใช้เวลาในการเพิ่มประสิทธิภาพการดำเนินการประเภทใดประเภทหนึ่ง

อันที่จริง เราเชื่อมต่อกับ Wilson และทีม Financial Times Labs และส่งผลให้มีการปรับปรุงการครอบคลุมเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome ของเครื่องมือประสิทธิภาพเลย์เอาต์ ในเร็วๆ นี้เราจะเพิ่มความสามารถในการดูขอบเขตการส่งต่อขององค์ประกอบ และเหตุการณ์ของเลย์เอาต์ในไทม์ไลน์เต็มไปด้วยรายละเอียดเกี่ยวกับขอบเขต รูท และต้นทุนของเลย์เอาต์แต่ละรายการ ดังนี้

ป๊อปอัปเลย์เอาต์การซิงค์ที่บังคับ