คำถามติดแท็ก branch-prediction

26
เหตุใดการประมวลผลอาร์เรย์ที่เรียงลำดับจึงเร็วกว่าการประมวลผลอาร์เรย์ที่ไม่เรียงลำดับ
Наэтотвопросестьответына กองมากเกินнарусском : Почемуотсортированныймассивобрабатываетсябыстрее, чемнеотсортированный? นี่คือโค้ด C ++ ที่แสดงพฤติกรรมที่แปลกประหลาดบางอย่าง ด้วยเหตุผลแปลก ๆ บางอย่างการเรียงลำดับข้อมูลทำให้โค้ดเร็วขึ้นเกือบหกเท่า: #include <algorithm> #include <ctime> #include <iostream> int main() { // Generate data const unsigned arraySize = 32768; int data[arraySize]; for (unsigned c = 0; c < arraySize; ++c) data[c] = std::rand() % 256; // !!! With this, the …

5
ทำไม (a * b! = 0) เร็วกว่า (a! = 0 && b! = 0) ใน Java
ฉันกำลังเขียนโค้ดบางส่วนใน Java ที่ ณ จุดหนึ่งการไหลของโปรแกรมจะถูกกำหนดโดยตัวแปร int สองตัวคือ "a" และ "b" ไม่ใช่ศูนย์ (หมายเหตุ: a และ b ไม่เคยเป็นลบและ ไม่เคยอยู่ในช่วงล้นจำนวนเต็ม) ฉันสามารถประเมินด้วย if (a != 0 && b != 0) { /* Some code */ } หรืออีกวิธีหนึ่ง if (a*b != 0) { /* Some code */ } เนื่องจากฉันคาดหวังว่าโค้ดส่วนนั้นจะวิ่งนับล้านครั้งต่อการวิ่งฉันจึงสงสัยว่าอันไหนจะเร็วกว่า ฉันทำการทดลองโดยการเปรียบเทียบพวกมันกับอาเรย์ที่สร้างขึ้นแบบสุ่มขนาดใหญ่และฉันก็อยากรู้ว่าสเปร์ตี้ของอาเรย์ (เศษส่วนของข้อมูล = 0) จะส่งผลต่อผลลัพธ์อย่างไร: long …

10
อะไรคือผลของการสั่งซื้อถ้า ... หากงบโดยความน่าจะเป็น
โดยเฉพาะอย่างยิ่งถ้าฉันมีชุดคำสั่งif... else ifและฉันก็รู้ว่าความน่าจะเป็นแบบสัมพัทธ์ที่แต่ละคำสั่งจะประเมินเป็นtrueเท่าใดความแตกต่างของเวลาการดำเนินการจึงทำให้เรียงลำดับตามความน่าจะเป็นเท่าใด ตัวอย่างเช่นฉันควรจะชอบสิ่งนี้: if (highly_likely) //do something else if (somewhat_likely) //do something else if (unlikely) //do something สำหรับสิ่งนี้?: if (unlikely) //do something else if (somewhat_likely) //do something else if (highly_likely) //do something ดูเหมือนว่ารุ่นที่เรียงจะเร็วกว่าอย่างไรก็ตามเพื่อความสะดวกในการอ่านหรือการมีผลข้างเคียงเราอาจต้องการเรียงลำดับแบบไม่เหมาะสม เป็นการยากที่จะบอกได้ว่า CPU จะทำอย่างไรกับการคาดคะเนสาขาจนกว่าคุณจะเรียกใช้รหัสจริง ดังนั้นในการทดลองกับสิ่งนี้ฉันลงเอยด้วยการตอบคำถามของฉันเองสำหรับกรณีเฉพาะ แต่ฉันต้องการฟังความคิดเห็น / ข้อมูลเชิงลึกอื่น ๆ ด้วย สำคัญ: คำถามนี้สันนิษฐานว่าifคำสั่งนั้นสามารถเรียงลำดับใหม่โดยพลการโดยไม่มีผลกระทบใด ๆ ต่อพฤติกรรมของโปรแกรม ในคำตอบของฉันการทดสอบตามเงื่อนไขสามข้อนั้นไม่เหมือนกันและไม่มีผลข้างเคียง แน่นอนถ้างบต้องได้รับการประเมินในลำดับที่แน่นอนเพื่อให้บรรลุพฤติกรรมที่ต้องการบางอย่างแล้วปัญหาของประสิทธิภาพคือ moot

8
มีคำใบ้คอมไพเลอร์สำหรับ GCC เพื่อบังคับให้การทำนายสาขาเป็นไปในทางที่แน่นอนหรือไม่?
สำหรับสถาปัตยกรรม Intel มีวิธีใดที่จะสั่งให้คอมไพเลอร์ GCC สร้างโค้ดที่บังคับให้การทำนายสาขาเป็นวิธีเฉพาะในโค้ดของฉันเสมอ ฮาร์ดแวร์ของ Intel รองรับสิ่งนี้หรือไม่ แล้วคอมไพเลอร์หรือฮาร์ดแวร์อื่น ๆ ล่ะ? ฉันจะใช้สิ่งนี้ในรหัส C ++ ซึ่งฉันรู้ว่ากรณีที่ฉันต้องการทำงานอย่างรวดเร็วและไม่สนใจเกี่ยวกับการชะลอตัวเมื่อสาขาอื่นต้องดำเนินการแม้ว่าสาขานั้นจะเพิ่งเข้ามาเมื่อไม่นานมานี้ for (;;) { if (normal) { // How to tell compiler to always branch predict true value? doSomethingNormal(); } else { exceptionalCase(); } } ตามคำถามสำหรับ Evdzhan Mustafa คำใบ้สามารถระบุคำใบ้เป็นครั้งแรกที่โปรเซสเซอร์พบคำสั่งการทำนายสาขาที่ตามมาทั้งหมดทำงานได้ตามปกติหรือไม่

16
“ IF” แพงไหม
ตลอดชีวิตของฉันจำสิ่งที่ครูของเราพูดในวันนั้นไม่ได้และฉันหวังว่าคุณคงจะรู้ โมดูลนี้คือ "โครงสร้างข้อมูลและอัลกอริทึม" และเขาบอกเราบางอย่างตามบรรทัดของ: ifคำสั่งมีราคาแพงที่สุด [บางสิ่งบางอย่าง] [บางอย่าง] ลงทะเบียน [บางอย่าง] ใช่ฉันมีความทรงจำที่น่ากลัวและฉันขอโทษจริงๆ แต่ฉันใช้ googling มาหลายชั่วโมงแล้วและไม่มีอะไรเกิดขึ้น ความคิดใด ๆ ?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.