ใช่ทั้งการจัดตำแหน่งและการจัดเรียงข้อมูลของคุณสามารถสร้างความแตกต่างอย่างมากในประสิทธิภาพไม่ใช่แค่เพียงไม่กี่เปอร์เซ็นต์เท่านั้น
ใช้วงนี้สองคำแนะนำสำคัญถ้าคุณใช้ลูปเพียงพอ
.globl ASMDELAY
ASMDELAY:
subs r0,r0,#1
bne ASMDELAY
bx lr
ทั้งที่มีและไม่มีแคชและมีการจัดตำแหน่งที่มีและไม่มีแคชในการคาดคะเนสาขาและคุณสามารถเปลี่ยนแปลงประสิทธิภาพการทำงานของทั้งสองคำสั่งด้วยจำนวนเงินที่มีนัยสำคัญ (เห็บตัวจับเวลา):
min max difference
00016DDE 003E025D 003C947F
การทดสอบประสิทธิภาพที่คุณสามารถทำได้อย่างง่ายดาย เพิ่มหรือลบ nops รอบ ๆ รหัสภายใต้การทดสอบและทำหน้าที่กำหนดเวลาได้อย่างแม่นยำย้ายคำแนะนำภายใต้การทดสอบไปตามที่อยู่ในช่วงกว้างพอที่จะสัมผัสกับขอบของบรรทัดแคช ฯลฯ
สิ่งเดียวกันกับการเข้าถึงข้อมูล สถาปัตยกรรมบางแห่งบ่นเกี่ยวกับการเข้าถึงที่ไม่ได้จัดไว้ (ตัวอย่างเช่นการอ่าน 32 บิตตามที่อยู่ 0x1001) โดยให้ข้อมูลผิดพลาด บางคนที่คุณสามารถปิดการใช้งานความผิดพลาดและรับผลการปฏิบัติงาน คนอื่น ๆ ที่อนุญาตให้เข้าถึงแบบไม่ได้ลงพื้นที่คุณจะได้รับประสิทธิภาพการทำงานสูงสุด
บางครั้งมันก็เป็น "คำแนะนำ" แต่ส่วนใหญ่จะเป็นวงจรนาฬิกา / บัส
ดู memcpy implementations ใน gcc สำหรับเป้าหมายต่าง ๆ สมมติว่าคุณกำลังคัดลอกโครงสร้างที่มีขนาด 0x43 ไบต์คุณอาจพบว่ามีการใช้งานที่คัดลอกหนึ่งไบต์ที่เหลือ 0x42 จากนั้นคัดลอก 0x40 ไบต์ในชิ้นส่วนที่มีประสิทธิภาพมากจากนั้น 0x2 สุดท้ายอาจทำสองไบต์แบบเดี่ยวหรือเป็นการถ่ายโอน 16 บิต การจัดแนวและเป้าหมายเข้ามาเล่นถ้าแหล่งที่มาและที่อยู่ปลายทางอยู่ในแนวเดียวกันบอกว่า 0x1003 และ 0x2003 จากนั้นคุณสามารถทำหนึ่งไบต์จากนั้น 0x40 ในกลุ่มก้อนใหญ่แล้ว 0x2 แต่ถ้าหนึ่งคือ 0x1002 และอีก 0x1003 จริงน่าเกลียดและช้าจริง
ส่วนใหญ่แล้วจะเป็นรอบรถบัส หรือแย่กว่าจำนวนการโอน ใช้ตัวประมวลผลที่มีบัสข้อมูลขนาด 64 บิตเช่น ARM และทำการถ่ายโอนคำสี่คำ (อ่านหรือเขียน LDM หรือ STM) ตามที่อยู่ 0x1004 นั่นคือคำที่อยู่ในแนวเดียวกันและถูกต้องตามกฎหมาย แต่ถ้าเป็นรถบัส 64 ความกว้างบิตมีแนวโน้มว่าคำสั่งเดียวจะเปลี่ยนเป็นสามการถ่ายโอนในกรณีนี้คือ 32 บิตที่ 0x1004, 64 บิตที่ 0x1008 และ 32 บิตที่ 0x100A แต่ถ้าคุณมีคำสั่งเดียวกัน แต่ที่ที่อยู่ 0x1008 มันสามารถทำการถ่ายโอนคำสี่คำเดียวได้ที่ที่อยู่ 0x1008 การถ่ายโอนแต่ละครั้งมีการตั้งค่าที่เกี่ยวข้อง ดังนั้นความแตกต่างของที่อยู่ 0x1004 ถึง 0x1008 ด้วยตัวมันเองอาจเร็วขึ้นหลายเท่าแม้แต่ / esp เมื่อใช้แคชและทั้งหมดคือการเข้าชมแคช
การพูดถึงแม้ว่าคุณจะอ่านสองคำที่ที่อยู่ 0x1000 เทียบกับ 0x0FFC แต่การ 0x0FFC ที่มีแคชหายไปจะทำให้สองบรรทัดแคชอ่านโดยที่ 0x1000 เป็นหนึ่งในแคชบรรทัดคุณจะได้รับโทษของแคชที่อ่านต่อไปสำหรับสุ่ม การเข้าถึง (อ่านข้อมูลมากกว่าการใช้) แต่ก็เพิ่มเป็นสองเท่า วิธีจัดโครงสร้างของคุณหรือข้อมูลของคุณโดยทั่วไปและความถี่ในการเข้าถึงข้อมูลนั้นอาจทำให้เกิดการแคชได้
คุณสามารถจบการสตริปข้อมูลของคุณเช่นเมื่อคุณประมวลผลข้อมูลที่คุณสามารถสร้างการขับไล่คุณจะได้รับเคราะห์ร้ายที่แท้จริงและจบลงด้วยการใช้แคชเพียงเศษเสี้ยวของคุณและเมื่อคุณกระโดดผ่านมัน . โดยการผสมข้อมูลของคุณหรือจัดเรียงฟังก์ชั่นใหม่ในซอร์สโค้ด ฯลฯ คุณสามารถสร้างหรือลบการชนได้เนื่องจากแคชทั้งหมดไม่ได้ถูกสร้างขึ้นเท่ากับคอมไพเลอร์จะไม่ช่วยคุณตรงจุดนี้ แม้แต่การตรวจจับการโจมตีหรือปรับปรุงประสิทธิภาพก็ยังอยู่กับคุณ
ทุกสิ่งที่เราเพิ่มเข้ามาเพื่อปรับปรุงประสิทธิภาพบัสข้อมูลที่กว้างขึ้นท่อส่งข้อมูลแคชการคาดคะเนสาขาการดำเนินการหลายหน่วย / เส้นทาง ฯลฯ มักจะช่วยได้ แต่ส่วนใหญ่จะมีจุดอ่อนซึ่งสามารถถูกนำไปใช้โดยเจตนา มีคอมไพเลอร์หรือไลบรารีน้อยมากที่สามารถทำได้หากคุณสนใจประสิทธิภาพที่คุณต้องการปรับแต่งและหนึ่งในปัจจัยการปรับแต่งที่ใหญ่ที่สุดคือการจัดตำแหน่งของรหัสและข้อมูลไม่ใช่แค่จัดวางบน 32, 64, 128, 256 ขอบเขตบิต แต่สิ่งที่สัมพันธ์กันคุณต้องการลูปที่ใช้งานหนักหรือข้อมูลที่ใช้ซ้ำเพื่อไม่ให้ลงจอดด้วยวิธีแคชเดียวกันพวกเขาแต่ละคนต้องการตัวเอง คอมไพเลอร์สามารถช่วยยกตัวอย่างการสั่งซื้อคำสั่งสำหรับสถาปัตยกรรมแบบซูเปอร์สเกลาร์, การจัดเรียงคำสั่งใหม่ที่สัมพันธ์กันไม่สำคัญ
การกำกับดูแลที่ใหญ่ที่สุดคือการสันนิษฐานว่าโปรเซสเซอร์เป็นคอขวด ไม่เป็นความจริงมานานกว่าทศวรรษหรือมากกว่านั้นการป้อนตัวประมวลผลเป็นปัญหาและนั่นคือปัญหาที่เกิดขึ้นเช่นการจัดประสิทธิภาพการจัดแนวการแคชแคช ฯลฯ เข้ามาเล่น ด้วยการทำงานเพียงเล็กน้อยแม้ในระดับซอร์สโค้ดการจัดเรียงข้อมูลใหม่ในโครงสร้างการเรียงลำดับการประกาศตัวแปร / โครงสร้างการจัดเรียงฟังก์ชันภายในซอร์สโค้ดและรหัสพิเศษเล็กน้อยเพื่อจัดเรียงข้อมูลสามารถปรับปรุงประสิทธิภาพได้หลายครั้งหรือ มากกว่า.