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

การปรับให้เหมาะสมคือการปรับปรุงวิธีหรือการออกแบบ ในการเขียนโปรแกรมการปรับให้เหมาะสมมักจะอยู่ในรูปแบบของการเพิ่มความเร็วของอัลกอริทึมหรือลดทรัพยากรที่ต้องการ ความหมายของการเพิ่มประสิทธิภาพก็คืออัลกอริธึมการเพิ่มประสิทธิภาพเชิงตัวเลขที่ใช้ในการเรียนรู้ของเครื่อง

14
การเพิ่มประสิทธิภาพแอปพลิเคชัน Android ก่อนเปิดตัว [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ฉันอยู่ในสถานการณ์ " พิเศษ " เกี่ยวกับประสิทธิภาพของโปรแกรมของฉัน ตอนนี้ฉันอยู่ที่ขั้นตอนที่ฉันจำเป็นต้องปรับปรุงประสิทธิภาพการทำงานของแอพลิเคชันและลดการใช้พลังงานแบตเตอรี่ ก่อนคำถาม: ก่อนอื่นใบสมัครของฉันได้ผล มันทำงานได้ดี - ไม่มีข้อผิดพลาดใด ๆ ประการที่สองฉันได้อ่านOptimizing Battery Life บนเว็บไซต์นักพัฒนา Androidและฉันได้เพิ่มประสิทธิภาพสิ่งเล็ก ๆ ที่พวกเขาร้องขอ ไม่มีปัญหาใด ๆ ตอนนี้ฉันอยากรู้เกี่ยวกับการแก้ไขพิเศษของนักพัฒนาคนอื่น ๆที่พวกเขาใช้เพื่อเพิ่มประสิทธิภาพแอปพลิเคชันของตนเอง สิ่งที่ผู้ใช้อาจไม่รู้จักหรือให้ความสนใจ อย่างไรก็ตามการแก้ไขจะช่วยเพิ่มอายุการใช้งานแบตเตอรี่หรือช่วยปรับปรุงการบำรุงรักษาแอปพลิเคชัน ดังนั้นสิ่งที่เพิ่มประสิทธิภาพเคล็ดลับเฉพาะของคุณ (s)? ฉันอยู่ในสถานการณ์เฉพาะที่ฉันต้องการความรู้จริงๆและฉันคิดว่านี่จะเป็นโอกาสที่ดีในการแบ่งปันความรู้ให้กับนักพัฒนาเกี่ยวกับสถานการณ์ที่พวกเขาเคยอยู่ โปรดโหวตคำตอบที่ยอดเยี่ยมเพราะจะกระตุ้นให้นักพัฒนาที่ยอดเยี่ยมแบ่งปันความรู้ของพวกเขา


1
วิธีใดเป็นวิธีที่ดีที่สุดในการตั้งค่ารีจิสเตอร์เป็นศูนย์ในแอสเซมบลี x86: xor, mov หรือและ?
คำแนะนำต่อไปนี้ทั้งหมดทำสิ่งเดียวกัน: ตั้งค่า%eaxเป็นศูนย์ วิธีใดเหมาะสมที่สุด (ต้องใช้รอบเครื่องน้อยที่สุด) xorl %eax, %eax mov $0, %eax andl $0, %eax

27
วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหาบิตชุดสูงสุด (msb) ในจำนวนเต็มใน C
ถ้าฉันมีจำนวนเต็ม n และฉันต้องการทราบตำแหน่งของบิตที่มีนัยสำคัญที่สุด (นั่นคือถ้าบิตที่มีนัยสำคัญน้อยที่สุดอยู่ทางขวาฉันต้องการทราบตำแหน่งของบิตทางซ้ายที่ไกลที่สุดซึ่งเป็น 1) วิธีใดที่เร็วที่สุด / มีประสิทธิภาพที่สุดในการค้นหา ฉันรู้ว่า POSIX สนับสนุนffs()วิธีการใน strings.h เพื่อค้นหาบิตชุดแรก แต่ดูเหมือนจะไม่มีfls()วิธีที่เกี่ยวข้อง มีวิธีที่ชัดเจนในการทำสิ่งนี้ที่ฉันพลาดไปหรือไม่? แล้วในกรณีที่คุณไม่สามารถใช้ฟังก์ชัน POSIX เพื่อการพกพาได้ล่ะ? แก้ไข: สิ่งที่เกี่ยวกับโซลูชันที่ใช้ได้กับสถาปัตยกรรมทั้ง 32 และ 64 บิต (รายการรหัสหลายรายการดูเหมือนว่าจะใช้ได้เฉพาะกับ 32 บิตเท่านั้น)


3
เหตุใดคอมไพเลอร์ C ++ จึงไม่ปรับการกำหนดบูลีนแบบมีเงื่อนไขนี้ให้เหมาะสมเป็นการมอบหมายแบบไม่มีเงื่อนไข
พิจารณาฟังก์ชันต่อไปนี้: void func(bool& flag) { if(!flag) flag=true; } สำหรับฉันแล้วดูเหมือนว่าหากแฟล็กมีค่าบูลีนที่ถูกต้องสิ่งนี้จะเทียบเท่ากับการตั้งค่าโดยไม่มีเงื่อนไขtrueดังนี้: void func(bool& flag) { flag=true; } ทั้ง gcc หรือ clang ไม่ได้ปรับให้เหมาะสมด้วยวิธีนี้ - ทั้งคู่สร้างสิ่งต่อไปนี้ที่-O3ระดับการเพิ่มประสิทธิภาพ: _Z4funcRb: .LFB0: .cfi_startproc cmp BYTE PTR [rdi], 0 jne .L1 mov BYTE PTR [rdi], 1 .L1: rep ret คำถามของฉันคือรหัสเป็นกรณีพิเศษเกินกว่าที่จะดูแลเพื่อเพิ่มประสิทธิภาพหรือมีเหตุผลที่ดีที่ทำให้การเพิ่มประสิทธิภาพดังกล่าวไม่เป็นที่ต้องการเนื่องจากflagไม่ได้อ้างอิงถึงvolatile? ดูเหมือนว่าเหตุผลเดียวที่อาจเป็นไปได้คือflagอาจมีค่าที่ไม่ใช่trueหรือfalseมูลค่าโดยไม่มีพฤติกรรมที่ไม่ได้กำหนดเมื่ออ่าน แต่ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่
117 c++  optimization 

30
แนวทางปฏิบัติในการเข้ารหัสซึ่งช่วยให้คอมไพเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโปรแกรมได้เร็วขึ้น
หลายปีก่อนคอมไพเลอร์ C ไม่ค่อยฉลาดนัก ในฐานะที่เป็นวิธีแก้ปัญหา K&R ได้คิดค้นคีย์เวิร์ดregisterเพื่อบอกใบ้ถึงคอมไพเลอร์ว่าอาจเป็นความคิดที่ดีที่จะเก็บตัวแปรนี้ไว้ในรีจิสเตอร์ภายใน พวกเขายังสร้างตัวดำเนินการระดับอุดมศึกษาเพื่อช่วยสร้างรหัสที่ดีขึ้น เมื่อเวลาผ่านไปคอมไพเลอร์ก็ครบกำหนด พวกเขาฉลาดมากที่การวิเคราะห์โฟลว์ช่วยให้ตัดสินใจได้ดีขึ้นเกี่ยวกับค่าที่จะเก็บไว้ในรีจิสเตอร์มากกว่าที่คุณจะทำได้ คีย์เวิร์ด register ไม่สำคัญ FORTRAN อาจเร็วกว่า C สำหรับการดำเนินการบางประเภทเนื่องจากปัญหานามแฝง ในทางทฤษฎีด้วยการเข้ารหัสอย่างรอบคอบเราสามารถหลีกเลี่ยงข้อ จำกัด นี้เพื่อให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสที่เร็วขึ้น มีแนวทางปฏิบัติในการเข้ารหัสอะไรบ้างที่อาจทำให้คอมไพลเลอร์ / เครื่องมือเพิ่มประสิทธิภาพสร้างโค้ดได้เร็วขึ้น การระบุแพลตฟอร์มและคอมไพเลอร์ที่คุณใช้จะได้รับการชื่นชม ทำไมเทคนิคนี้ดูเหมือนจะใช้ได้ผล? ขอแนะนำโค้ดตัวอย่าง นี่คือคำถามที่เกี่ยวข้อง [แก้ไข] คำถามนี้ไม่เกี่ยวกับกระบวนการโดยรวมในการสร้างโปรไฟล์และเพิ่มประสิทธิภาพ สมมติว่าโปรแกรมได้รับการเขียนอย่างถูกต้องรวบรวมด้วยการเพิ่มประสิทธิภาพเต็มรูปแบบทดสอบและนำไปใช้ในการผลิต อาจมีโครงสร้างในโค้ดของคุณที่ห้ามไม่ให้เครื่องมือเพิ่มประสิทธิภาพทำงานให้ดีที่สุดเท่าที่จะทำได้ คุณสามารถทำอะไรได้บ้างในการ refactor ที่จะลบข้อห้ามเหล่านี้และอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพสร้างรหัสได้เร็วขึ้น [แก้ไข] ลิงก์ที่เกี่ยวข้องกับออฟเซ็ต

4
วิธีโอเวอร์โหลด std :: swap ()
std::swap()ถูกใช้โดยคอนเทนเนอร์มาตรฐานจำนวนมาก (เช่นstd::listและstd::vector) ในระหว่างการเรียงลำดับและแม้กระทั่งการกำหนด แต่การนำ std ไปใช้swap()นั้นเป็นแบบทั่วไปและค่อนข้างไม่มีประสิทธิภาพสำหรับประเภทที่กำหนดเอง ดังนั้นประสิทธิภาพจะได้รับจากการโอเวอร์โหลดstd::swap()ด้วยการใช้งานเฉพาะประเภทที่กำหนดเอง แต่คุณจะใช้มันได้อย่างไรเพื่อให้ std container ใช้?

14
เครื่องมือสำหรับการเพิ่มประสิทธิภาพ JPEG? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ คุณรู้หรือไม่ว่ามีเครื่องมือใดบ้าง (แนะนำให้ใช้บรรทัดคำสั่ง) ในการปรับแต่ง JPEG โดยอัตโนมัติและไม่สูญเสียซึ่งฉันสามารถรวมเข้ากับสภาพแวดล้อมการสร้างของเราได้ สำหรับ PNG ฉันกำลังใช้PNGOUTและโดยทั่วไปแล้วจะประหยัดแบนด์วิดท์ / ขนาดภาพได้ประมาณ 40% อย่างน้อยที่สุดฉันต้องการเครื่องมือที่สามารถดึงข้อมูลเมตาออกจาก JPG ได้ - ฉันสังเกตเห็นกรณีแปลก ๆ ที่ฉันพยายามสร้างภาพขนาดย่อจากภาพถ่ายและไม่สามารถทำให้มันเล็กกว่า 34 kB ได้ หลังจากตรวจสอบเพิ่มเติมฉันพบว่าข้อมูล EXIF ​​ยังคงเป็นส่วนหนึ่งของรูปภาพและภาพขนาดย่อมีขนาด 3 kB หลังจากลบข้อมูลเมตา และนอกเหนือจากนั้น - เป็นไปได้หรือไม่ที่จะเพิ่มประสิทธิภาพ JPG โดยไม่สูญเสีย เครื่องมือเพิ่มประสิทธิภาพ PNG พยายามใช้กลยุทธ์การบีบอัดที่แตกต่างกันการเริ่มต้นแบบสุ่มของการเข้ารหัส Huffmann เป็นต้น ฉันทราบว่าการประหยัดส่วนใหญ่มาจากพารามิเตอร์คุณภาพ JPEG และเป็นการวัดที่ค่อนข้างเป็นอัตวิสัย …
114 optimization  jpeg 

13
ใน C ++ ฉันควรกังวลกับตัวแปรแคชหรือให้คอมไพเลอร์ทำการปรับให้เหมาะสม? (นามแฝง)
พิจารณารหัสต่อไปนี้ ( pเป็นประเภทunsigned char*และbitmap->widthเป็นจำนวนเต็มบางประเภทซึ่งไม่ทราบแน่ชัดและขึ้นอยู่กับเวอร์ชันของไลบรารีภายนอกที่เราใช้): for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } คุ้มไหมที่จะเพิ่มประสิทธิภาพ [.. ] มีบางกรณีไหมที่สามารถให้ผลลัพธ์ที่มีประสิทธิภาพมากขึ้นโดยการเขียน: unsigned width(static_cast<unsigned>(bitmap->width)); for (unsigned x = 0; x < width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } …

3
ฉันจะเลือกขนาดกริดและบล็อกสำหรับเมล็ด CUDA ได้อย่างไร
นี่เป็นคำถามเกี่ยวกับวิธีกำหนดขนาดกริดบล็อกและเธรด CUDA นี่เป็นคำถามที่เพิ่มเติมให้กับคนที่โพสต์ที่นี่ ตามลิงค์นี้คำตอบจากกรงเล็บมีข้อมูลโค้ด (ดูด้านล่าง) ฉันไม่เข้าใจความคิดเห็น "ค่ามักจะถูกเลือกโดยการปรับแต่งและข้อ จำกัด ของฮาร์ดแวร์" ฉันไม่พบคำอธิบายที่ดีหรือคำชี้แจงที่อธิบายเรื่องนี้ในเอกสาร CUDA โดยสรุปคำถามของฉันคือวิธีกำหนดblocksize(จำนวนเธรด) ที่เหมาะสมที่สุดโดยใช้รหัสต่อไปนี้: const int n = 128 * 1024; int blocksize = 512; // value usually chosen by tuning and hardware constraints int nblocks = n / nthreads; // value determine by block size and total work madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

6
เหตุใด. NET / C # จึงไม่ปรับให้เหมาะสมสำหรับการเรียกซ้ำหางโทร
ฉันพบคำถามนี้เกี่ยวกับภาษาที่เพิ่มประสิทธิภาพการเรียกซ้ำหาง เหตุใด C # จึงไม่เพิ่มประสิทธิภาพการเรียกซ้ำหางเมื่อใดก็ตามที่ทำได้ สำหรับกรณีที่เป็นรูปธรรมเหตุใดจึงไม่ปรับวิธีนี้ให้เหมาะสมกับการวนซ้ำ ( Visual Studio 2008 32 บิตถ้าเป็นเช่นนั้น): private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }

3
เหตุใดไบนารีสองโปรแกรมที่มีเฉพาะความคิดเห็นจึงไม่เปลี่ยนไปตรงกับใน gcc
ฉันสร้างโปรแกรม C สองโปรแกรม โปรแกรม 1 int main() { } โปรแกรม 2 int main() { //Some Harmless comments } AFAIK เมื่อรวบรวมคอมไพเลอร์ (gcc) ควรละเว้นความคิดเห็นและพื้นที่สีขาวที่ซ้ำซ้อนและด้วยเหตุนี้ผลลัพธ์จึงต้องใกล้เคียงกัน แต่เมื่อฉันตรวจสอบ md5sums ของไบนารีเอาต์พุตมันไม่ตรงกัน ฉันลองรวบรวมด้วยการเพิ่มประสิทธิภาพ-O3แล้ว-Ofastแต่ก็ยังไม่ตรงกัน เกิดอะไรขึ้นที่นี่? แก้ไข: คำสั่งที่แน่นอนและมี md5sums คือ (t1.c คือโปรแกรม 1 และ t2.c คือโปรแกรม 2) gcc ./t1.c -o aaa gcc ./t2.c -o bbb 98c1a86e593fd0181383662e68bac22f aaa c10293cbe6031b13dc6244d01b4d2793 bbb …

8
วิธีต่างๆในการเพิ่มลงในพจนานุกรม
อะไรคือความแตกต่างในDictionary.add(key, value)และDictionary[key] = value? ฉันสังเกตเห็นว่าเวอร์ชันล่าสุดไม่โยนArgumentExceptionเมื่อใส่คีย์ที่ซ้ำกัน แต่มีเหตุผลใดที่จะชอบเวอร์ชันแรก? แก้ไข : ใครมีแหล่งข้อมูลที่เชื่อถือได้เกี่ยวกับเรื่องนี้หรือไม่? ฉันได้ลอง MSDN แล้ว แต่มันก็เหมือนกับการไล่ล่าห่านป่า :(

18
strlen จะถูกคำนวณหลายครั้งหากใช้ในเงื่อนไขการวนซ้ำ?
ฉันไม่แน่ใจว่าโค้ดต่อไปนี้อาจทำให้เกิดการคำนวณซ้ำซ้อนหรือเป็นรหัสเฉพาะของคอมไพเลอร์ for (int i = 0; i < strlen(ss); ++i) { // blabla } จะstrlen()คำนวณทุกครั้งเมื่อiเพิ่มขึ้น?
109 c++  c  gcc  optimization  strlen 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.