คำถามติดแท็ก compiler-optimization

การเพิ่มประสิทธิภาพคอมไพลเลอร์เกี่ยวข้องกับการปรับคอมไพเลอร์เพื่อลดรันไทม์หรือขนาดอ็อบเจ็กต์หรือทั้งสองอย่าง สิ่งนี้สามารถทำได้โดยใช้อาร์กิวเมนต์ของคอมไพเลอร์ (เช่น CFLAGS, LDFLAGS), ปลั๊กอินคอมไพเลอร์ (เช่น DEHYDRA) หรือการแก้ไขโดยตรงกับคอมไพลเลอร์ (เช่นการแก้ไขซอร์สโค้ด)

13
ฉันจะสร้างลูปที่ไม่มีที่สิ้นสุดที่ไม่ได้รับการปรับให้เหมาะสมได้อย่างไร
มาตรฐาน C11 ดูเหมือนจะบ่งบอกว่างบการวนซ้ำที่มีการควบคุมการแสดงออกอย่างต่อเนื่องไม่ควรปรับให้เหมาะสม ฉันรับคำแนะนำจากคำตอบนี้ซึ่งอ้างอิงส่วน 6.8.5 จากร่างมาตรฐานโดยเฉพาะ: คำสั่งวนซ้ำซึ่งนิพจน์การควบคุมไม่ใช่นิพจน์คงที่ ... อาจถูกสันนิษฐานโดยการนำไปใช้เพื่อยุติ ในคำตอบนั้นระบุว่าการวนซ้ำเช่นwhile(1) ;นั้นไม่ควรมีการปรับให้เหมาะสม ดังนั้น ... ทำไม Clang / LLVM เพิ่มประสิทธิภาพลูปด้านล่าง (รวบรวมด้วยcc -O2 -std=c11 test.c -o test)? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } บนเครื่องของฉันสิ่งนี้จะพิมพ์ออกมาbeginและเกิดปัญหากับคำสั่งที่ผิดกฎหมาย ( ud2กับดักวางไว้die()) เมื่อวันที่ godboltputsเราจะเห็นว่าไม่มีอะไรที่จะถูกสร้างขึ้นหลังจากการเรียกร้องให้ มันเป็นงานที่ยากอย่างน่าประหลาดใจที่ทำให้ Clang แสดงผลวนลูปไม่สิ้นสุดภายใต้-O2- ในขณะที่ฉันสามารถทดสอบvolatileตัวแปรซ้ำได้ซึ่งเกี่ยวข้องกับการอ่านหน่วยความจำที่ฉันไม่ต้องการ และถ้าฉันทำอะไรแบบนี้: …

3
การใช้ตัวชี้นี้ทำให้เกิดการลดประสิทธิภาพแบบแปลก ๆ ใน hot loop
ฉันเพิ่งเจอการลดประสิทธิภาพแบบแปลก ๆ (หรือค่อนข้างพลาดโอกาสในการเพิ่มประสิทธิภาพ) พิจารณาฟังก์ชันนี้เพื่อการคลายอาร์เรย์ของจำนวนเต็ม 3 บิตเป็นจำนวนเต็ม 8 บิตอย่างมีประสิทธิภาพ มันคลาย 16 ints ในการวนซ้ำแต่ละครั้ง: void unpack3bit(uint8_t* target, char* source, int size) { while(size > 0){ uint64_t t = *reinterpret_cast<uint64_t*>(source); target[0] = t & 0x7; target[1] = (t >> 3) & 0x7; target[2] = (t >> 6) & 0x7; target[3] = (t >> …

11
ประสิทธิภาพของการกลับมาก่อนกำหนดในฟังก์ชัน
นี่เป็นสถานการณ์ที่ฉันพบบ่อยในฐานะโปรแกรมเมอร์ที่ไม่มีประสบการณ์และฉันสงสัยว่าโดยเฉพาะอย่างยิ่งสำหรับโครงการที่มีความทะเยอทะยานและใช้ความเร็วสูงของฉันฉันกำลังพยายามเพิ่มประสิทธิภาพ สำหรับภาษาหลัก ๆ เช่น C (C, objC, C ++, Java, C # ฯลฯ ) และคอมไพเลอร์ตามปกติฟังก์ชันทั้งสองนี้จะทำงานได้อย่างมีประสิทธิภาพหรือไม่ มีความแตกต่างในโค้ดที่คอมไพล์หรือไม่? void foo1(bool flag) { if (flag) { //Do stuff return; } //Do different stuff } void foo2(bool flag) { if (flag) { //Do stuff } else { //Do different stuff } } โดยทั่วไปแล้วจะมีโบนัส / …

3
ระดับการเพิ่มประสิทธิภาพเสียงดัง
บน gcc, คู่มืออธิบายถึงสิ่งที่-O3, -Osฯลฯ แปลในแง่ของการขัดแย้งการเพิ่มประสิทธิภาพโดยเฉพาะ ( -funswitch-loops, -fcompare-elimฯลฯ ) ฉันกำลังมองหาข้อมูลเหมือนกันสำหรับเสียงดังกราว ผมมองออนไลน์และในการman clangที่เพียง แต่ช่วยให้ข้อมูลทั่วไป ( -O2เพิ่มประสิทธิภาพมากกว่า-O1, -Osจะเพิ่มประสิทธิภาพสำหรับความเร็ว, ... ) และยังมองที่นี่ในกองมากเกินและพบนี้แต่ฉันไม่ได้พบอะไรที่เกี่ยวข้องในการอ้างถึงไฟล์ที่มา แก้ไข:ผมพบคำตอบ แต่ฉันสนใจยังคงถ้าใครมีการเชื่อมโยงไปยังเอกสารใช้คู่มือการเพิ่มประสิทธิภาพทั้งหมดผ่านและผ่านการคัดเลือกจาก ขณะนี้ฉันเพิ่งพบนี้รายการผ่าน แต่ไม่มีอะไรในระดับที่เพิ่มประสิทธิภาพ-Ox

2
เหตุใดสวิตช์จึงไม่ปรับให้เหมาะสมในลักษณะเดียวกับการผูกมัดในกรณีอื่นใน c / c ++
การดำเนินการตามตารางต่อไปนี้จะสร้างชุดของคำสั่ง cmp / je อย่างที่ฉันคาดหวังว่าจะถูกล่ามโซ่หากข้อความ: int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; } else if (num == 4){ return 16; } else if …

2
การทดสอบการหารได้เร็วขึ้นกว่าตัวดำเนินการ%
ฉันสังเกตเห็นสิ่งที่อยากรู้ในคอมพิวเตอร์ของฉัน *การทดสอบการหารด้วยลายมือเขียนเร็วกว่า%ผู้ปฏิบัติงานอย่างมาก ลองพิจารณาตัวอย่างน้อยที่สุด: * AMD Ryzen Threadripper 2990WX, GCC 9.2.0 static int divisible_ui_p(unsigned int m, unsigned int a) { if (m <= a) { if (m == a) { return 1; } return 0; } m += a; m >>= __builtin_ctz(m); return divisible_ui_p(m, a); } ตัวอย่างที่ถูก จำกัด ด้วยแปลกและa m > …

1
เหตุใดการเริ่มต้นรวม GCC ของอาร์เรย์จึงเติมเต็มทั้งศูนย์ด้วยก่อนรวมถึงองค์ประกอบที่ไม่ใช่ศูนย์
ทำไม gcc เติมทั้งอาร์เรย์ด้วยศูนย์แทนที่จะเป็นจำนวนเต็ม 96 เท่านั้นที่เหลือ? initializers ที่ไม่ใช่ศูนย์ทั้งหมดอยู่ที่จุดเริ่มต้นของอาร์เรย์ void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1 และ gcc9.2 สร้าง asm เช่นนี้ ( Godbolt …

2
Java 8: Class.getName () ทำให้การเชื่อมโยงสตริงช้าลง
เมื่อเร็ว ๆ นี้ฉันพบปัญหาเกี่ยวกับการต่อข้อมูลสตริง เกณฑ์มาตรฐานนี้สรุป: @OutputTimeUnit(TimeUnit.NANOSECONDS) public class BrokenConcatenationBenchmark { @Benchmark public String slow(Data data) { final Class<? extends Data> clazz = data.clazz; return "class " + clazz.getName(); } @Benchmark public String fast(Data data) { final Class<? extends Data> clazz = data.clazz; final String clazzName = clazz.getName(); return "class " + …

2
คอมไพเลอร์ของฉันเพิกเฉยต่อสมาชิกคลาส thread_local ที่ไม่ได้ใช้ของฉันหรือไม่
ฉันต้องการลงทะเบียนกระทู้ในชั้นเรียนของฉันดังนั้นฉันตัดสินใจที่จะเพิ่มการตรวจสอบสำหรับthread_localคุณสมบัติ: #include <iostream> #include <thread> class Foo { public: Foo() { std::cout << "Foo()" << std::endl; } ~Foo() { std::cout << "~Foo()" << std::endl; } }; class Bar { public: Bar() { std::cout << "Bar()" << std::endl; //foo; } ~Bar() { std::cout << "~Bar()" << std::endl; } private: static thread_local …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.