- ลำดับชั้นของหน่วยความจำและการออกแบบโครงสร้างข้อมูลเป็นปัจจัยสำคัญที่กำหนดการใช้งานแคชของซีพียู
- การจัดกลุ่มข้อมูลที่ใช้งานบ่อย การใช้คอนเทนเนอร์ที่ต่อเนื่องกัน และรูปแบบ SoA ช่วยลดแคชพลาดและปรับปรุงความหน่วงแฝง
- ในระบบปฏิบัติการ Windows การอัปเดตระบบและไดรเวอร์ รวมถึงการจำกัดกระบวนการทำงานเบื้องหลัง จะช่วยเพิ่มพื้นที่ว่างให้กับ CPU, RAM และแคช
- การผสานการปรับแต่งซอฟต์แวร์เข้ากับการปรับพลังงาน และหากจำเป็น การปรับปรุงฮาร์ดแวร์ จะช่วยเพิ่มประสิทธิภาพโดยรวมให้สูงสุด
การเพิ่มประสิทธิภาพแคชของ CPUเป็นหนึ่งในหัวข้อที่แยกแยะโค้ดที่ "ใช้งานได้" ออกจากโค้ดที่ "ทำงานได้เร็วปานสายฟ้า" เมื่อเราเข้าใจวิธีการจัดระเบียบหน่วยความจำ เวลาในการเข้าถึงของแต่ละระดับ และพฤติกรรมของฮาร์ดแวร์ เราจะสามารถปรับปรุงประสิทธิภาพได้อย่างมหาศาลโดยไม่ต้องเปลี่ยนเครื่องคอมพิวเตอร์
ในขณะเดียวกัน ผู้ใช้ Windows จำนวนมากประสบปัญหาที่พบได้ทั่วไปมากกว่า นั่นคือ คอมพิวเตอร์ทำงานช้า และบ่อยครั้งต้นตอของปัญหาอยู่ที่การใช้งานหน่วยความจำ แคช และซีพียูอย่างไม่มีประสิทธิภาพ ด้วยการออกแบบระดับต่ำที่ดี (โครงสร้างข้อมูล รูปแบบการเข้าถึงหน่วยความจำ) และการปรับแต่งที่เหมาะสมใน Windows (การล้างข้อมูล การอัปเดต โหมดพลังงาน ฯลฯ) จะสามารถปรับปรุงประสิทธิภาพได้อย่างเห็นได้ชัด ตั้งแต่เพิ่มขึ้นเล็กน้อย 5% ไปจนถึงเพิ่มขึ้นถึง 30-40% ในบางสถานการณ์
ลำดับชั้นของหน่วยความจำและเวลาแฝง: เหตุใดแคชจึงมีความสำคัญ
ก่อนที่เราจะเริ่มปรับแต่งโค้ดหรือกำหนดค่า Windows สิ่งสำคัญคือต้องเข้าใจสิ่งหนึ่งก่อน นั่นคือ หน่วยความจำไม่ได้มีประสิทธิภาพเท่ากันทั้งหมด ความแตกต่างระหว่างการเข้าถึงแคช L1, L2, L3, RAM หรือดิสก์นั้นมหาศาล และการเพิ่มประสิทธิภาพแคชจำนวนมากนั้นอาศัยหลักการหลีกเลี่ยงการเข้าถึงระดับหน่วยความจำที่ช้ากว่าให้มากที่สุดเท่าที่จะเป็นไปได้
ในโปรเซสเซอร์สมัยใหม่ เวลาในการเข้าถึงข้อมูลโดยทั่วไป (โดยประมาณ) จะเป็นดังนี้: การเข้าถึงแคช L1ใช้เวลาประมาณครึ่งนาโนวินาที การคาดการณ์การกระโดดผิดพลาดใช้เวลาหลายนาโนวินาที แคช L2ใช้เวลาประมาณ 7 นาโนวินาที ในขณะที่การเข้าถึงหน่วยความจำหลักอาจเกิน 100 นาโนวินาที หากเราย้ายออกไปนอกคอมพิวเตอร์ (เครือข่าย, SSD, ฮาร์ดไดรฟ์แบบกลไก) ตัวเลขจะพุ่งสูงขึ้นเป็นหลายแสนหรือหลายล้านนาโนวินาที
ความแตกต่างที่ชัดเจนนี้เองที่ทำให้การจัดระเบียบข้อมูลอย่างเหมาะสม การลดแคชมิส และการออกแบบรูปแบบการเข้าถึงแบบเรียงลำดับมีความสำคัญอย่างยิ่ง ลูปที่ทำงานอยู่ในแคช L1 จะเร็วกว่าลูปที่เข้าถึง RAM หรือ SSD อย่างต่อเนื่องอย่างมาก แม้ว่าจะมีหน้าที่การทำงานเดียวกันในเชิงตรรกะก็ตาม
นอกจากนี้ แคชของ CPU ยังถูกจัดระเบียบเป็นหลายระดับ ได้แก่ L1 ซึ่งมีขนาดเล็กมากและเร็วมาก L2 ซึ่งมีขนาดใหญ่กว่าและช้าลงเล็กน้อย และ L3 ซึ่งมีขนาดใหญ่กว่ามากและมักใช้ร่วมกันระหว่างคอร์ต่างๆ แนวคิดคือการเก็บข้อมูลที่เข้าถึงบ่อยที่สุด (ข้อมูล "ร้อน") ไว้ใกล้มือและจัดเก็บส่วนที่เหลือไว้ในระดับที่ช้ากว่า ในฐานะนักพัฒนา เราสามารถช่วยให้สิ่งนี้เกิดขึ้นได้อย่างเป็นธรรมชาติด้วยการออกแบบโครงสร้างข้อมูลที่ดีและการเข้าถึงที่คาดการณ์ได้
แคชคืออะไร และเหตุใดจึงส่งผลต่อประสิทธิภาพ?
แคช ไม่ว่าจะอยู่ในบริบทใด (ซีพียู ดิสก์ เว็บ ฯลฯ) ก็คือการจัดเก็บข้อมูลที่ใช้งานล่าสุดอย่างรวดเร็วแทนที่จะเข้าถึงแหล่งข้อมูลที่ช้าที่สุดเสมอ เราจะเก็บสำเนาของสิ่งที่น่าจะถูกนำมาใช้ซ้ำมากที่สุด ซึ่งจะช่วยลดเวลาตอบสนองและลดภาระของทรัพยากรหลัก
โดยทั่วไป การแคชใช้เพื่อเพิ่มความเร็วในการเข้าถึงและปรับปรุงประสบการณ์การใช้งานของผู้ใช้ ในทางปฏิบัติแล้ว การแคชยังช่วยให้ระบบสามารถทำงานได้มากขึ้นด้วยฮาร์ดแวร์เท่าเดิม กล่าวคือ ลดการรอคอย ลดจำนวนบล็อก และลดจำนวนคิว นั่นเป็นเหตุผลที่การแคชถูกใช้ในซีพียู ดิสก์ เบราว์เซอร์ ระบบแบบกระจาย และซอฟต์แวร์แทบทุกชนิดที่จัดการข้อมูลอย่างเข้มข้น
โดยทั่วไปแล้วพีซีจะมีแคชหลายประเภท ได้แก่แคชดิสก์ (RAM ที่เก็บข้อมูลจากฮาร์ดไดรฟ์), แคชเว็บ (ทรัพยากรคงที่ของเบราว์เซอร์) และแคชซีพียู (L1, L2, L3) แคชทั้งหมดทำงานบนหลักการพื้นฐานเดียวกัน คือ การจัดเก็บสิ่งที่น่าจะจำเป็นต้องใช้ในภายหลัง เพื่อหลีกเลี่ยงการทำงานซ้ำซ้อนที่ช้า
ประเภทของแคช: แคชดิสก์, แคชเว็บ และแคชซีพียู
ในระบบจริงนั้น กลไกการแคชหลายอย่างจะทำงานร่วมกัน โดยแต่ละกลไกทำงานในระดับของตนเอง การทำความเข้าใจกลไกเหล่านี้จะช่วยทั้งในการเขียนโปรแกรมให้ดีขึ้นและในการวินิจฉัยสาเหตุที่พีซีทำงานได้แย่กว่าที่คาดไว้
ดิสก์แคช
แคชดิสก์คือพื้นที่หน่วยความจำ (โดยปกติคือ RAM) ที่ระบบปฏิบัติการใช้เก็บข้อมูลที่อ่านหรือเขียนลงดิสก์เมื่อเร็วๆ นี้เมื่อแอปพลิเคชันร้องขอข้อมูลนั้นอีกครั้ง ระบบจะตรวจสอบแคชก่อน หากข้อมูลนั้นมีอยู่ การเข้าถึงจะเร็วกว่าการเข้าถึงจากดิสก์มาก โดยเฉพาะอย่างยิ่งกับฮาร์ดไดรฟ์แบบกลไก
กลไกนี้ช่วยลดเวลาในการโหลด ลดจำนวนการอ่านและเขียนข้อมูลทางกายภาพ และส่งผลให้ยืดอายุการใช้งานของดิสก์ได้ ในสถานการณ์ที่มีการเข้าถึงไฟล์เดียวกันซ้ำๆ (ฐานข้อมูล เซิร์ฟเวอร์ แอปพลิเคชันที่ใช้ทรัพยากรมาก) การแคชดิสก์จะสร้างความแตกต่างอย่างมาก
เว็บแคช
ในเบราว์เซอร์ของคุณ แคชเว็บจะจัดเก็บรูปภาพ สไตล์ชีต JavaScript และทรัพยากรอื่นๆ ไว้ชั่วคราว これにより เบราว์เซอร์ของคุณจึงสามารถเข้าถึงข้อมูลที่จัดเก็บไว้ได้ เมื่อคุณกลับมาเยี่ยมชมหน้าเว็บเดิมหรือไปยังส่วนต่างๆ ภายในเว็บไซต์เดียวกัน แทนที่จะต้องขอข้อมูลจากเครือข่ายอีกครั้ง
ผลลัพธ์ที่ได้คือสองด้าน: เวลาในการโหลดที่สั้นลงสำหรับผู้ใช้ และการใช้แบนด์วิดท์ที่ลดลง ทั้งจากการเชื่อมต่อของคุณและจากเซิร์ฟเวอร์ที่ให้บริการเนื้อหา อย่างไรก็ตาม หากแคชไม่ได้รับการจัดการอย่างเหมาะสม อาจมีทรัพยากรที่ล้าสมัยปรากฏขึ้น ซึ่งเป็นเหตุผลว่าทำไมบางครั้งจึงแนะนำให้ล้างแคช
แคช CPU: ระดับ L1, L2 และ L3
หัวใจสำคัญที่ทำให้ประสิทธิภาพการทำงานดีขึ้นคือแคชของซีพียู โปรเซสเซอร์สมัยใหม่มีแคชหลายระดับเรียงลำดับชั้น เพื่อลดความหน่วงในการเข้าถึงข้อมูลและคำสั่ง โดยทั่วไปแล้ว L1 เป็นแคชที่เล็กที่สุดและเร็วที่สุด L2 เป็นแคชระดับกลาง และ L3 เป็นแคชที่ใหญ่ที่สุดและช้าที่สุด ซึ่งมักจะใช้ร่วมกัน
แคชL1โดยทั่วไปจะแบ่งออกเป็นส่วนคำสั่งและส่วนข้อมูล โดยมีขนาดทั่วไปประมาณไม่กี่สิบกิโลไบต์ต่อคอร์ มีความเร็วสูงมากและใช้สำหรับการประมวลผลทันทีแคช L2มีความจุมากกว่า (หลายร้อยกิโลไบต์ถึงหลายเมกะไบต์) และทำหน้าที่เป็นตัวสำรองสำหรับ L1 แคช L3สามารถมีขนาดได้ถึงหลายเมกะไบต์หรือหลายสิบเมกะไบต์ ใช้ร่วมกันโดยหลายคอร์ และทำหน้าที่เป็นระดับสุดท้ายก่อนที่จะเข้าถึง RAM
เมื่อรูปแบบการเข้าถึงหน่วยความจำเป็นไปอย่างเป็นลำดับหรือคาดเดาได้ ฮาร์ดแวร์จะสามารถคาดการณ์และนำข้อมูลไปยังระดับแคชที่เหมาะสมได้ แต่หากรูปแบบการเข้าถึงหน่วยความจำนั้นวุ่นวาย เต็มไปด้วยการกระโดดแบบสุ่มและโครงสร้างที่กระจัดกระจาย โปรเซสเซอร์จะเสียเวลารอหน่วยความจำ มากเกินไป และซีพียูจะ "เบื่อ" นี่คือจุดที่การเพิ่มประสิทธิภาพในระดับโค้ดเข้ามามีบทบาท
ปรับโครงสร้างข้อมูลให้เหมาะสมสำหรับการแคชบน CPU
ประสิทธิภาพส่วนใหญ่ขึ้นอยู่กับวิธีการออกแบบโครงสร้างข้อมูลของเรา การมีอ็อบเจ็กต์ขนาดใหญ่ที่มีฟิลด์ที่ใช้งานบ่อยและฟิลด์ที่ใช้งานน้อยปะปนกันนั้นไม่เหมือนกับการแยกสิ่งที่ใช้บ่อยออกจากสิ่งที่ใช้ไม่บ่อย แคชไลน์ทุกบรรทัดที่ส่งไปยังโปรเซสเซอร์มีต้นทุน หากเราเติมแคชไลน์เหล่านั้นด้วยข้อมูลที่ไร้ประโยชน์ เราก็กำลังสิ้นเปลืองแบนด์วิดท์
จัดกลุ่มข้อมูลร้อนและแยกข้อมูลเย็นออกจากกัน
กลยุทธ์สำคัญคือการระบุว่าฟิลด์ใดในโครงสร้างถูกเรียกใช้งานเกือบทุกครั้ง ("ข้อมูลร้อน") และฟิลด์ใดถูกใช้งานเพียงบางครั้ง ("ข้อมูลเย็น") ฟิลด์กลุ่มแรกควรจัดเก็บไว้ด้วยกันในหน่วยความจำและหากเป็นไปได้ ควรจัดให้อยู่ในแคชไลน์เดียวหรือสองแคชไลน์ ส่วนฟิลด์กลุ่มหลังสามารถจัดเก็บไว้ในโครงสร้างแยกต่างหาก โดยอ้างอิงด้วยตัวชี้หรือดัชนี
ตัวอย่างเช่น แทนที่จะมีอ็อบเจ็กต์ผู้ใช้ที่มีสตริงยาวๆ (ชื่อ ประวัติ อีเมล) ปะปนกับแฟล็กหรือเครื่องหมายที่ถูกตรวจสอบอยู่ตลอดเวลา การจัดกลุ่มข้อมูล "ที่ใช้งานบ่อย" (รหัสผู้ใช้ การเข้าสู่ระบบครั้งล่าสุด สถานะการใช้งาน) ไว้ในโครงสร้างที่กระชับกว่า และเก็บข้อมูลส่วนที่เหลือไว้ในโครงสร้าง "รายละเอียด" แยกต่างหาก จะดีกว่า ด้วยวิธีนี้ เมื่อโค้ดวนลูปผ่านรายการผู้ใช้เพื่อตรวจสอบสถานะหรือเครื่องหมาย บรรทัดแคชก็จะถูกเติมด้วยข้อมูลที่เกี่ยวข้องเกือบทั้งหมด
ลดปริมาณฟิลเลอร์และใช้ทุกบรรทัดให้เกิดประโยชน์สูงสุด
อีกหนึ่งสมรภูมิสำคัญอยู่ที่การออกแบบโครงสร้างทางกายภาพ นั่นคือลำดับของฟิลด์และชนิดของฟิลด์ เนื่องจากปัญหาเรื่องการจัดเรียง การผสมชนิดของฟิลด์ที่มีขนาดต่างกันอย่างไม่เป็นระเบียบอาจทำให้เกิดไบต์ส่วนเกินที่ไม่จำเป็น ซึ่งสิ้นเปลืองหน่วยความจำ และที่แย่กว่านั้นคือ สิ้นเปลืองแคชไลน์
หากเราจัดลำดับโครงสร้างข้อมูลใหม่โดยจัดกลุ่มชนิดข้อมูลขนาดใหญ่ไว้ก่อน (เช่น double หรือ int64_t) จากนั้นจึงเป็นชนิดข้อมูลขนาดกลาง และสุดท้ายคือชนิดข้อมูลขนาดเล็กที่สุด (bool, char) โดยทั่วไปแล้วเราจะลดหรือกำจัดส่วนที่เกินออกไปได้มาก ซึ่งจะช่วยให้สามารถจัดเก็บองค์ประกอบได้มากขึ้นต่อบรรทัดแคช ลดภาระต่อลำดับชั้นของหน่วยความจำ และลดโอกาสที่จะเกิดข้อผิดพลาดในการเข้าถึงหน่วยความจำ
เลือกภาชนะที่อยู่ติดกัน
โดยทั่วไปแล้ว คอนเทนเนอร์ที่จัดเก็บองค์ประกอบในหน่วยความจำต่อเนื่องเช่น เวกเตอร์ จะเป็นมิตรกับแคชมากกว่าโครงสร้างที่ใช้โหนดแบบกระจัดกระจายที่เชื่อมโยงกันด้วยตัวชี้ (ต้นไม้ รายการเชื่อมโยงแบบคลาสสิก ฯลฯ) เมื่อทำการสำรวจเวกเตอร์ ฮาร์ดแวร์สามารถคาดการณ์การเข้าถึงครั้งต่อไปได้อย่างแม่นยำและโหลดบรรทัดแคชถัดไปล่วงหน้าได้
ในทางตรงกันข้าม โครงสร้างอย่างเช่นแผนที่แบบต้นไม้หรือรายการเชื่อมโยงจะกระจายโหนดไปทั่วฮีป ทำให้ซีพียูต้องไล่ตามตัวชี้อย่างต่อเนื่อง การไล่ตามแต่ละครั้งอาจทำให้เกิดแคชพลาดและต้องเสียเวลาในการดึงข้อมูลกลับไปยังหน่วยความจำหลัก นี่คือเหตุผลที่ไลบรารีสมัยใหม่หลายแห่งนำเสนอแผนที่แฮชแบบหนาแน่นตารางแบบเปิด และคอนเทนเนอร์อื่นๆ ที่พยายามรักษาข้อมูลให้มีขนาดกะทัดรัดที่สุดเท่าที่จะเป็นไปได้
บริการพื้นที่จัดเก็บข้อมูลออนไลน์สำหรับของสะสมขนาดเล็ก
อัลกอริทึมหลายตัวเกี่ยวข้องกับชุดข้อมูลขนาดเล็กมาก (จำนวนเต็มไม่กี่ตัว โครงสร้างไม่กี่อย่าง) ที่ถูกสร้างและทำลายอย่างต่อเนื่อง หากชุดข้อมูลแต่ละชุดทำให้เกิดการจัดสรรหน่วยความจำแบบฮีป เราจะไม่เพียงแต่เสียค่าใช้จ่ายในการจัดการหน่วยความจำเท่านั้น แต่ยังทำให้ข้อมูลกระจัดกระจายไปทั่ว RAM อีกด้วย วิธีแก้ปัญหาคือการใช้คอนเทนเนอร์ที่มีพื้นที่จัดเก็บข้อมูลแบบออนไลน์สำหรับข้อมูลขนาดเล็ก
คอนเทนเนอร์ประเภทนี้จะสงวนพื้นที่สำหรับองค์ประกอบ 8 หรือ 16 รายการโดยตรงภายในตัววัตถุเอง ตราบใดที่ยังไม่เกินขีดจำกัดนี้ ก็ไม่จำเป็นต้องเข้าถึงฮีป และข้อมูลจะยังคงเชื่อมโยงกับส่วนที่เหลือของฟังก์ชันหรือสถานะของคลาส ซึ่งเป็นประโยชน์อย่างมากสำหรับการแคช
รูปแบบการเข้าถึง: จาก AoS ไปสู่ SoA และการใช้บิตเซ็ต
แม้จะมีแคชที่มีโครงสร้างที่ดี แต่รูปแบบการเข้าถึงข้อมูลก็เป็นตัวกำหนดประสิทธิภาพเป็นส่วนใหญ่ การท่องไปในอาร์เรย์ตามลำดับนั้นไม่เหมือนกับการกระโดดจากที่อยู่หนึ่งไปยังอีกที่อยู่หนึ่งโดยอาศัยรายการของตัวชี้ มีเทคนิคบางอย่างที่ใช้กันทั่วไปเพื่อเพิ่มประสิทธิภาพการใช้แคชให้สูงสุด
อาร์เรย์ของโครงสร้าง (Array of Structures - AoS) เทียบกับ โครงสร้างของอาร์เรย์ (Structure of Arrays - SoA)
รูปแบบคลาสสิกอย่างหนึ่งคือการเปลี่ยนจากการออกแบบ "อาร์เรย์ของโครงสร้าง" (AoS) ไปเป็น "อาร์เรย์โครงสร้าง" (SoA) ใน AoS แต่ละองค์ประกอบเป็นอ็อบเจ็กต์ที่มีฟิลด์จำนวนมาก (ตัวอย่างเช่น ตำแหน่งและมวลของอนุภาค) และองค์ประกอบเหล่านี้จะถูกจัดเก็บตามลำดับ เมื่อคุณต้องการอ่านเพียงบางส่วนของฟิลด์เหล่านี้ (ตัวอย่างเช่น ตำแหน่ง) คุณจะต้องโหลดแคชไลน์ซึ่งมีข้อมูลที่ไม่ได้ใช้รวมอยู่ด้วย
ใน SoA นั้น คุณลักษณะต่างๆ จะถูกแยกออกเป็นอาร์เรย์คู่ขนาน เช่น อาร์เรย์สำหรับ x, อาร์เรย์สำหรับ y, อาร์เรย์สำหรับ z, อาร์เรย์สำหรับมวล และอื่นๆ ดังนั้น หากอัลกอริทึมทำการอัปเดตเฉพาะตำแหน่ง ก็จะเข้าถึงเฉพาะอาร์เรย์พิกัดเท่านั้น และแคชจะไม่ปนเปื้อนด้วยข้อมูลที่ไม่เกี่ยวข้องนอกจากนี้ การออกแบบนี้ยังเอื้อต่อการใช้เวกเตอร์และการใช้คำสั่ง SIMD อีกด้วย
บิตเซ็ตและการอ้างอิงตามดัชนี
สำหรับโดเมนขนาดเล็ก (เช่น แฟล็กที่มีค่าตั้งแต่ 0 ถึง 255) การใช้บิตเซ็ตมีประสิทธิภาพมากกว่าโครงสร้างเซ็ตแบบแฮชมาก บิตเซ็ตขนาด 256 ตำแหน่งใช้พื้นที่เพียงไม่กี่สิบไบต์ และช่วยให้การทำงานรวดเร็ว ต่อเนื่อง และเป็นมิตรกับแคช แทนที่จะต้องแก้ไขปัญหาการชนกันในตารางแฮช
ในทำนองเดียวกัน การแทนที่ตัวชี้ด้วยดัชนีในอาร์เรย์ที่ต่อเนื่องกันสามารถลดขนาดของโครงสร้าง (ดัชนี 32 บิตแทนที่จะเป็นตัวชี้ 64 บิต) และปรับปรุงความสอดคล้องของแคชได้ แทนที่จะกระจายโหนดไปทั่วฮีป จะมีการจัดเก็บเวกเตอร์ของโหนดและเข้าถึงตามตำแหน่ง ซึ่งช่วยให้การท่องไปตามลำดับทำได้ง่ายขึ้น
การดึงข้อมูลล่วงหน้า: เมื่อใดควรดำเนินการล่วงหน้าก่อนเริ่มงาน
นอกเหนือจากการดึงข้อมูลล่วงหน้าด้วยฮาร์ดแวร์ ซึ่งพยายามคาดการณ์รูปแบบการเข้าถึงตามลำดับแล้ว เรายังมีคำสั่งดึงข้อมูลล่วงหน้าด้วยซอฟต์แวร์เพื่อเร่งการโหลดข้อมูลในกรณีเฉพาะ ซึ่งเหมาะสมเมื่อรูปแบบนั้นคาดเดาได้แต่ไม่เป็นเชิงเส้นอย่างเคร่งครัด เช่นที่เกิดขึ้นในตารางแฮชหรือรายการเชื่อมโยง
แนวคิดโดยทั่วไปนั้นง่ายมาก: ในขณะที่กำลังประมวลผลองค์ประกอบที่ i คุณจะสั่งให้ฮาร์ดแวร์นำองค์ประกอบที่ i+1 (หรือบล็อกในอนาคต) เข้ามาในแคช เมื่อคุณไปถึงองค์ประกอบนั้น ความน่าจะเป็นที่องค์ประกอบนั้นจะอยู่ใน L1 หรือ L2 อยู่แล้วจะสูง และเวลาในการรอจะลดลง สามารถนำไปใช้ได้โดยใช้พรีเฟตช์ไทป์ของคอมไพเลอร์หรือไลบรารีเฉพาะ
อย่างไรก็ตาม การใช้การดึงข้อมูลล่วงหน้าแบบชัดเจนสำหรับการเข้าถึงข้อมูลแบบเรียงลำดับโดยสมบูรณ์นั้นไม่มีประโยชน์ เพราะฮาร์ดแวร์จัดการโดยอัตโนมัติอยู่แล้ว ในความเป็นจริง การเพิ่มการดึงข้อมูลล่วงหน้าที่ไม่จำเป็นอาจทำให้แคชรกและทำให้ประสิทธิภาพแย่ลง ดังเช่นกรณีส่วนใหญ่ของประสิทธิภาพ ควรวัดผลก่อนและหลังการเปลี่ยนแปลง
นโยบายการแคชตำแหน่ง การแทนที่ และการดึงข้อมูลล่วงหน้า
ในระดับทฤษฎี ระบบแคชจะทำงานบนพื้นฐานของนโยบายเกี่ยวกับการจัดเก็บข้อมูล การเรียกใช้ข้อมูล และข้อมูลที่จะลบออกเมื่อพื้นที่ไม่เพียงพอ แม้ว่ารายละเอียดเหล่านี้จะได้รับการจัดการโดยฮาร์ดแวร์หรือระบบปฏิบัติการ แต่การทำความเข้าใจรายละเอียดเหล่านี้จะช่วยในการตีความพฤติกรรมที่ผิดปกติบางอย่างได้
ในส่วนของตำแหน่งที่ตั้ง สามารถใช้ การแบ่งส่วนหน่วยความจำหรือรูปแบบการจัดสรรแบบเซตแอสโซซิเอทีฟได้ โดยที่แต่ละที่อยู่หน่วยความจำหลักจะสามารถแมปไปยังส่วนย่อยของแคชได้เท่านั้น ซึ่งส่งผลต่อจำนวนข้อขัดแย้งและความน่าจะเป็นที่ที่อยู่สองที่อยู่จะซ้ำกันภายในแคช
เกี่ยวกับการล้างแคช (สิ่งที่เกิดขึ้นเมื่อแคชไม่พบข้อมูลที่ต้องการ) นั้น มีนโยบายการแทนที่ข้อมูลเข้ามาเกี่ยวข้อง ได้แก่ LRU (Least Recently Used), FIFO หรือแม้แต่การแทนที่แบบสุ่ม LRU พยายามเก็บข้อมูลที่ใช้งานล่าสุดไว้ในแคช โดยสมมติว่าข้อมูลนั้นจะถูกเรียกใช้งานอีกครั้ง ในขณะที่ FIFO จะทิ้งข้อมูลที่เก่าที่สุดไป นโยบายแต่ละแบบมีข้อดีแตกต่างกันไป ขึ้นอยู่กับรูปแบบการเข้าถึงข้อมูลจริง
ในส่วนของการดึงข้อมูลล่วงหน้า (prefetching) มีกลไกที่อิงตามรูปแบบในอดีต: หากฮาร์ดแวร์ตรวจพบว่าการเข้าถึงแต่ละครั้งมีการเลื่อนไป 64 ไบต์เสมอ ฮาร์ดแวร์จะพยายามดึงข้อมูลบล็อกที่ต่อเนื่องกันล่วงหน้าในกรณีอื่นๆ จะใช้การดึงข้อมูลพื้นที่ล่วงหน้า (การดึงข้อมูลทั้งบล็อกแม้ว่าจะมีการร้องขอเพียงบางส่วน) เพื่อลดจำนวนการเข้าถึงหน่วยความจำหลักให้น้อยที่สุด
การวัดและวิเคราะห์พฤติกรรมของแคช
การปรับปรุงประสิทธิภาพโดยไม่วัดผลก็เหมือนกับการเดินเข้าไปโดยไม่รู้ทิศทาง มีเครื่องมือวิเคราะห์ประสิทธิภาพที่ช่วยให้คุณเห็นตัวชี้วัดแคชเฉพาะเจาะจงได้ เช่น จำนวนการอ้างอิง การพลาดแคชระดับ L1 การพลาดแคชระดับสุดท้าย (LLC) เปอร์เซ็นต์การพลาด เป็นต้น ตัวชี้วัดเหล่านี้บ่งชี้ว่าการเปลี่ยนแปลงของคุณช่วยปรับปรุงสถานการณ์ได้จริงหรือไม่
ตัวอย่างเช่น หากอัตราการพลาดแคช L1 อยู่ที่ประมาณ 2–3% โดยทั่วไปถือว่าอยู่ในระดับที่ยอมรับได้ ในขณะที่อัตราการพลาดที่สูงมากในแคชระดับสุดท้ายอาจบ่งชี้ถึง ปัญหา ความใกล้เคียงเชิงพื้นที่หรือเชิงเวลาการนำตัวเลขเหล่านี้มารวมกับโปรไฟล์ CPU และหน่วยความจำจะช่วยระบุได้ว่าส่วนใดของโค้ดที่สร้างภาระให้กับลำดับชั้นของหน่วยความจำมากที่สุด
การแคชและการเพิ่มประสิทธิภาพการทำงานใน Windows
นอกเหนือจากตัวโค้ดแล้ว ผู้ใช้หลายคนสงสัยว่าทำไมพีซี Windows ของพวกเขาถึงทำงานช้ามาก ทั้งๆ ที่ "ในทางทฤษฎี" แล้วมี CPU และ RAM ที่ดี ส่วนหนึ่งของคำตอบอยู่ที่ข้อเท็จจริงที่ว่าระบบปฏิบัติการ แอปพลิเคชันที่ทำงานอยู่ และข้อมูลที่ไม่จำเป็นต่างๆ ที่สะสมอยู่จะใช้ CPU หน่วยความจำ และแคชอย่างต่อเนื่อง ทำให้เหลือทรัพยากรน้อยลงสำหรับงานที่สำคัญ โดยการใช้การปรับแต่งเฉพาะบางอย่างใน Windows 10 และ Windows 11 คุณสามารถเพิ่มทรัพยากร CPU และ RAM ( เช่น โดยการกำหนดค่าหน่วยความจำเสมือน ) ลดกระบวนการทำงานเบื้องหลัง และปรับปรุงความสามารถของระบบในการแคชข้อมูลที่เกี่ยวข้อง ขึ้นอยู่กับสถานการณ์เริ่มต้น การปรับปรุงเหล่านี้อาจมีตั้งแต่การปรับแต่งเล็กน้อยไปจนถึงการเปลี่ยนแปลงที่สำคัญในประสิทธิภาพโดยรวม
อัปเดต Windows และไดรเวอร์
ขั้นตอนพื้นฐานมากที่หลายคนละเลยคือการอัปเดตทั้งระบบปฏิบัติการและไดรเวอร์ให้ทันสมัยอยู่เสมอ การอัปเดต Windows ไม่ได้มีเพียงแค่แพทช์ความปลอดภัยเท่านั้น แต่ยังมักรวมถึงการปรับปรุงการจัดการทรัพยากรการแก้ไขปัญหาหน่วยความจำรั่วไหล และการเพิ่มประสิทธิภาพเคอร์เนลด้วย
จากแผงการตั้งค่าของ Windows (เริ่ม > การตั้งค่า > การอัปเดตและความปลอดภัย > Windows Update) คุณสามารถค้นหาการอัปเดตทั่วไปและแพ็กเกจเสริมต่างๆ รวมถึงไดรเวอร์ที่ไม่สำคัญซึ่งสามารถเพิ่มประสิทธิภาพการทำงานของ CPU, GPU หรือชิปเซ็ตได้ การติดตั้งส่วนประกอบเหล่านี้สามารถแก้ไขปัญหาคอขวดหรือปัญหาเสถียรภาพที่ส่งผลโดยตรงต่อการใช้งานแคชและหน่วยความจำได้
ปิดใช้งานการแจกจ่ายอัปเดตแบบ P2P
ตั้งแต่ Windows 10 เป็นต้นมา ระบบสามารถดาวน์โหลดและแชร์การอัปเดตโดยใช้กลไก P2P กับคอมพิวเตอร์เครื่องอื่นได้ แม้ว่าระบบนี้จะชาญฉลาด แต่ก็หมายความว่าคอมพิวเตอร์จะใช้ CPU เครือข่าย และพื้นที่ดิสก์เพื่อช่วยกระจายการอัปเดต ซึ่งไม่ใช่สิ่งที่พึงปรารถนาเสมอไป
การปิดใช้งาน "การเพิ่มประสิทธิภาพการส่งมอบ" ใน Windows Update จะป้องกันไม่ให้พีซีของคุณส่งหรือดาวน์โหลดส่วนประกอบของการอัปเดตไปยังคอมพิวเตอร์เครื่องอื่น ซึ่งจะช่วยเพิ่มทรัพยากร ลดกิจกรรมเบื้องหลัง และสามารถปรับปรุงประสิทธิภาพโดยรวมได้ โดยเฉพาะอย่างยิ่งในระบบที่มีประสิทธิภาพต่ำ
เพิ่มพื้นที่ว่างในดิสก์และลบไฟล์ขยะ
เมื่อฮาร์ดไดรฟ์ของคุณเต็มหรือใกล้เต็ม Windows จะมีพื้นที่เหลือน้อยลงสำหรับเพจจิ้งและการสร้างไฟล์ชั่วคราว ซึ่งส่งผลกระทบต่อประสิทธิภาพการทำงานในที่สุด การใช้ เครื่องมือ Disk Cleanup ที่มีอยู่ในตัว จะช่วยให้คุณลบไฟล์ชั่วคราว ไฟล์ที่เหลือจากการอัปเดต รายการในถังรีไซเคิล และข้อมูลที่ไม่จำเป็นอื่นๆ ได้
นอกเหนือจากเครื่องมือทำความสะอาดนี้แล้ว ขอแนะนำให้ล้างถังรีไซเคิลเป็นประจำ และใช้ตัวเลือกการจัดเก็บข้อมูลของ Windows เพื่อลบไฟล์ชั่วคราวที่สะสมไว้ ยิ่งมีพื้นที่ว่างในไดรฟ์ระบบน้อยเท่าไร ระบบหน่วยความจำก็จะทำงานได้อย่างมีประสิทธิภาพมากขึ้น และแคชดิสก์ก็จะทำงานได้อย่างมีประสิทธิภาพมากขึ้นเท่านั้น
เพิ่มประสิทธิภาพโปรแกรมเริ่มต้นและโปรแกรมเบื้องหลัง
หนึ่งในศัตรูตัวฉกาจที่สุดของ CPU และแคชในพีซีที่ใช้งานเป็นประจำทุกวันคือโปรแกรมที่เริ่มต้นทำงานโดยอัตโนมัติและทำงานอยู่เบื้องหลัง เช่น โปรแกรมซิงโครไนซ์ โปรแกรมอัปเดต โปรแกรมยูทิลิตี้ขนาดเล็กที่เราแทบไม่ได้ใช้ เป็นต้น แม้ว่าโปรแกรมเหล่านี้อาจดูเหมือนเบา แต่แต่ละโปรแกรมก็เพิ่มจำนวนเธรด หน่วยความจำ การเข้าถึงดิสก์ และการใช้แคช
จาก Task Manager หรือใช้Sysinternals เพื่อตรวจสอบกระบวนการทำงานในแท็บ Startup คุณสามารถปิดการใช้งานแอปพลิเคชันที่ไม่จำเป็นไม่ให้โหลดโดยอัตโนมัติได้ นอกจากนี้ คุณยังสามารถควบคุมแอปพลิเคชันที่ได้รับอนุญาตให้ทำงานในพื้นหลังได้ภายใต้การตั้งค่าความเป็นส่วนตัว การลดรายการนี้ไม่เพียงแต่ช่วยให้การเริ่มต้นระบบเร็วขึ้น แต่ยังช่วยลดภาระการทำงานอย่างต่อเนื่องของ CPU และ RAM อีกด้วย
ลดเอฟเฟกต์กราฟิกและการแจ้งเตือน
ภาพเคลื่อนไหวของหน้าต่าง ความโปร่งใส และการตกแต่งภาพอื่นๆ ใช้ทรัพยากรมาก ในคอมพิวเตอร์รุ่นเก่าหรือที่มีประสิทธิภาพต่ำ อาจเป็นประโยชน์ที่จะปรับการตั้งค่า Windows เพื่อจัดลำดับความสำคัญของประสิทธิภาพมากกว่ารูปลักษณ์ โดยทำได้ผ่านตัวเลือกขั้นสูงของระบบ ในส่วนประสิทธิภาพ โดยเลือกการกำหนดค่าที่เน้นความเร็ว
ในทำนองเดียวกัน การแจ้งเตือนที่มากเกินไปอาจทำให้ทั้งผู้ใช้และอุปกรณ์ทำงานหนักเกินไปการปิดใช้งานการแจ้งเตือนที่ไม่จำเป็นไม่เพียงแต่ทำให้ประสบการณ์การใช้งานง่ายขึ้นเท่านั้น แต่ยังป้องกันไม่ให้กระบวนการทำงานเบื้องหลังและการตรวจสอบต่างๆ ทำงานบ่อยเกินไปอีกด้วย
โหมดพลังงาน โหมดจำศีล และประสิทธิภาพสูงสุด
ระบบปฏิบัติการ Windows มีแผนการจัดการพลังงานหลายแบบที่ส่งผลโดยตรงต่อการจัดการ CPU ว่าจะให้ความสำคัญกับอายุการใช้งานแบตเตอรี่หรือประสิทธิภาพการทำงานเป็นหลัก โดยทั่วไปแล้ว การตรวจสอบการตั้งค่าเหล่านี้บนคอมพิวเตอร์เดสก์ท็อปและแล็ปท็อปที่เสียบปลั๊กอยู่เป็นเรื่องที่ควรทำ
Fast Startupผสานคุณสมบัติของการปิดเครื่องและการจำศีลเข้าด้วยกันเพื่อเพิ่มความเร็วในการบูตเครื่อง โดยการโหลดส่วนหนึ่งของเคอร์เนลและไดรเวอร์ล่วงหน้าก่อนปิดเครื่อง การเปิดใช้งานฟังก์ชันนี้สามารถลดเวลาในการบูตเครื่องได้อย่างมาก แต่ขอแนะนำให้ปิดใช้งานชั่วคราวหากทำให้เกิดปัญหาเกี่ยวกับการอัปเดตหรือการเข้าถึง BIOS
ในทางกลับกัน ยังมีโหมด "ประสิทธิภาพสูงสุด" ที่ซ่อนอยู่ซึ่งจะบังคับให้ CPU และส่วนประกอบอื่นๆ ทำงานโดยไม่คำนึงถึงประสิทธิภาพการใช้พลังงานมากนัก การเปิดใช้งานโหมดนี้อาจช่วยเพิ่มประสิทธิภาพในการทำงานที่ต้องการประสิทธิภาพสูงได้เล็กน้อย แต่ก็แลกมาด้วยความร้อนที่เพิ่มขึ้น เสียงพัดลมที่ดังขึ้น และการใช้พลังงานที่มากขึ้น
การจัดการพื้นที่และหน่วยความจำในระบบอย่างมีประสิทธิภาพ
นอกเหนือจากการทำความสะอาดและควบคุมโปรแกรมที่ทำงานอยู่ภายในเครื่องเป็นประจำแล้ว ยังมีวิธีอื่นๆ ที่จะช่วยให้ใช้ทรัพยากรทางกายภาพของคอมพิวเตอร์ได้อย่างมีประสิทธิภาพมากขึ้น รวมถึง CPU และแคชของดิสก์ด้วย
การที่เดสก์ท็อปเต็มไปด้วยไอคอน ทางลัด โฟลเดอร์ และไฟล์ต่างๆ ไม่ใช่แค่ทำให้ดูรกเท่านั้น แต่ Windows ยังต้องจัดการสิ่งเหล่านั้นทั้งหมด ซึ่งเพิ่มภาระการทำงานอีกด้วย การรักษาเดสก์ท็อปให้สะอาดและจัดระเบียบไฟล์ของคุณลงในโฟลเดอร์ต่างๆ ภายในไดรฟ์ของคุณเป็นวิธีง่ายๆ ที่ช่วยให้สภาพแวดล้อมการทำงานเบาลง
นอกจากนี้ การใช้โซลูชันจัดเก็บข้อมูลบนคลาวด์สำหรับไฟล์บางไฟล์ก็เป็นประโยชน์ เพราะช่วยลดปริมาณพื้นที่จัดเก็บข้อมูลในเครื่องลงได้ หากทำอย่างเหมาะสม (โดยไม่พึ่งพาการเชื่อมต่ออินเทอร์เน็ตทั้งหมด) ระบบในเครื่องก็จะทำงานหนักน้อยลงและมีความยืดหยุ่นมากขึ้น
เทคโนโลยีเฉพาะ: ReadyBoost, การโอเวอร์คล็อก และฮาร์ดแวร์
ในคอมพิวเตอร์ที่มีฮาร์ดไดรฟ์แบบกลไกและ RAM จำกัด Windows จะมีเทคโนโลยีอย่าง ReadyBoost ซึ่งช่วยให้คุณใช้ไดรฟ์ USB ที่มีความเร็วสูงเป็นเหมือนแคชเพิ่มเติมได้ แม้ว่าจะไม่ใช่ทางออกวิเศษ แต่ในบางการตั้งค่าก็สามารถช่วยเพิ่มประสิทธิภาพได้โดยการลดภาระการทำงานของฮาร์ดไดรฟ์ลง
ในอีกด้านหนึ่ง ผู้ใช้ขั้นสูงสามารถโอเวอร์คล็อก CPU ของตนได้โดยใช้เครื่องมือต่างๆ เช่น Intel Extreme Tuning Utility (สำหรับโปรเซสเซอร์ที่ปลดล็อกแล้ว) การเพิ่มความเร็วสัญญาณนาฬิกาจะช่วยเพิ่มประสิทธิภาพ แต่ก็เพิ่มอุณหภูมิและการใช้พลังงานด้วยเช่นกัน ซึ่งมีความเสี่ยงที่จะเกิดความไม่เสถียรและความเสียหายหากไม่ได้จัดการแรงดันไฟฟ้าและการระบายความร้อนอย่างระมัดระวัง
เมื่อการปรับแต่งซอฟต์แวร์ทั้งหมดไม่ได้ผล ก็ถึงเวลาพิจารณาการอัปเกรดฮาร์ดแวร์ เช่น การเปลี่ยนฮาร์ดไดรฟ์เป็น SSD การเพิ่ม RAM หรือแม้แต่การเปลี่ยนโปรเซสเซอร์หรือระบบทั้งหมด โดยเฉพาะอย่างยิ่ง SSD จะช่วยเปลี่ยนแปลงประสิทธิภาพของระบบอย่างเห็นได้ชัด เนื่องจากช่วยลดเวลาในการเข้าถึงดิสก์ลงอย่างมาก ซึ่งส่งผลให้แคชดิสก์และหน่วยความจำเสมือนทำงานได้อย่างราบรื่นยิ่งขึ้น
โดยรวมแล้ว การผสมผสานการออกแบบโครงสร้างข้อมูลที่ดีและรูปแบบการเข้าถึงหน่วยความจำเพื่อใช้ประโยชน์จากแคชของ CPU เข้ากับการกำหนดค่า Windows อย่างรอบคอบ (อัปเดตแล้ว น้ำหนักเบา ปราศจากกระบวนการที่ไม่จำเป็นหรือขยะ มีแผนการใช้พลังงานที่เหมาะสม และหากจำเป็น ให้ใช้ตัวช่วยเล็กๆ น้อยๆ เช่น ReadyBoost หรือการปรับปรุงฮาร์ดแวร์) จะช่วยให้คุณได้ประโยชน์จากเครื่องเดิมมากขึ้น ทำให้แอปพลิเคชันตอบสนองได้อย่างรวดเร็วและระบบรู้สึกเร็วขึ้นอย่างเห็นได้ชัดโดยไม่จำเป็นต้องใช้ "เวทมนตร์" หรือเทคนิคที่ซับซ้อน