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

4
การเพิ่มประสิทธิภาพอัตโนมัติของการคูณเวกเตอร์เมทริกซ์ 0-1
คำถาม: มีขั้นตอนหรือทฤษฎีที่สร้างขึ้นสำหรับการสร้างรหัสที่ใช้การคูณเมทริกซ์เวกเตอร์อย่างมีประสิทธิภาพหรือไม่เมื่อเมทริกซ์นั้นหนาแน่นและเต็มไปด้วยเลขศูนย์และอันเดียว ตามหลักการแล้วรหัสที่ได้รับการปรับปรุงจะใช้ประโยชน์จากข้อมูลที่คำนวณก่อนหน้านี้อย่างเป็นระบบเพื่อลดงานซ้ำซ้อน ในคำอื่น ๆ ฉันมีเมทริกซ์ และผมต้องการที่จะทำบาง precomputation ขึ้นอยู่กับที่จะทำให้การคำนวณเป็นที่มีประสิทธิภาพที่สุดเมื่อผมมารู้ทีหลังได้รับเวกเตอร์โวลต์MMMMMMMvMvMvvvv MMMเป็นเมทริกซ์ไบนารีหนาแน่นที่เป็นรูปสี่เหลี่ยมผืนผ้าที่รู้จักกันใน "เวลารวบรวม" ในขณะที่เป็นเวกเตอร์จริงที่ไม่รู้จักซึ่งรู้จักกันใน "เวลารัน" เท่านั้นvvv ตัวอย่างที่ 1: (หน้าต่างบานเลื่อน) ให้ฉันใช้ตัวอย่างเล็ก ๆ ง่ายๆเพื่ออธิบายประเด็นของฉัน พิจารณาเมทริกซ์ เผื่อว่าเราใช้เมทริกซ์นี้เพื่อเวกเตอร์จะได้รับW = Mv จากนั้นรายการของผลลัพธ์คือ \ start {align} w_1 & = v_1 + v_2 + v_3 + v_5 \\ w_2 & = v_2 + v_3 + v_4 + v_5 + …

1
มีการปรับแต่งคอมไพเลอร์อย่างเต็มที่เพื่อยุติโปรแกรมหรือไม่?
ในหนังสือของแอนดรูวแตะของโมเดิร์นคอมไพเลอร์ดำเนินการใน MLเขากล่าวว่าภายใต้บทที่ 17 ว่าComputability ทฤษฎีแสดงให้เห็นว่ามันจะเป็นไปได้ที่จะคิดค้นแปลงเพิ่มประสิทธิภาพใหม่และวิธีการที่จะพิสูจน์ว่าคอมไพเลอร์เพิ่มประสิทธิภาพอย่างเต็มที่จะแก้ปัญหาที่เกิดขึ้นเป็นง่อย: โปรแกรมQที่ไม่สร้างเอาต์พุตและไม่สามารถหยุดได้โดยง่ายด้วยการแทนค่าที่เหมาะสมที่สุดOpt (Q)คือ "L: goto L" คอมไพเลอร์ที่ปรับให้เหมาะสมที่สุดสามารถแก้ปัญหาการหยุดชะงักได้ ดังนั้นคำถามของฉันคือ: คอมไพเลอร์ปรับแต่งอย่างเต็มที่มีอยู่สำหรับการยกเลิกโปรแกรมหรือไม่? ความคิดเดียวของฉันมีดังต่อไปนี้: แม้ว่าโปรแกรมจะรับประกันว่าจะยุติมันก็ยังคงมีความซับซ้อนโดยพลการและสำหรับคอมไพเลอร์การเพิ่มประสิทธิภาพที่เป็นรูปธรรม, C, หนึ่งอาจสร้างโปรแกรมที่ใช้ C เป็นอินพุท เคสชนิดมุม นอกจากนี้อะไรคือความหมายของการ จำกัด ตัวเองให้ยกเลิกโปรแกรม?

12
โครงสร้างข้อมูลหรืออัลกอริทึมสำหรับค้นหาความแตกต่างระหว่างสตริงได้อย่างรวดเร็ว
ฉันมีอาร์เรย์ของ 100,000 สตริงทั้งหมดของความยาวkkkkฉันต้องการเปรียบเทียบแต่ละสตริงกับสตริงอื่น ๆ เพื่อดูว่ามีสองสตริงที่แตกต่างกัน 1 อักขระหรือไม่ ตอนนี้ที่ผมเพิ่มแต่ละสายไปยังอาร์เรย์ที่ฉันตรวจสอบกับทุกสตริงแล้วในอาร์เรย์ซึ่งมีความซับซ้อนเวลาของการkn(n−1)2kn(n−1)2k\frac{n(n-1)}{2} k มีโครงสร้างข้อมูลหรืออัลกอริทึมที่สามารถเปรียบเทียบสตริงได้เร็วกว่าสิ่งที่ฉันกำลังทำอยู่หรือไม่? ข้อมูลเพิ่มเติมบางส่วน: หัวข้อการสั่งซื้อ: abcdeและxbcdeแตกต่างกัน 1 ตัวอักษรในขณะที่abcdeและedcbaแตกต่างกัน 4 ตัว สำหรับแต่ละคู่ของสตริงที่แตกต่างกันโดยตัวละครตัวหนึ่งฉันจะลบหนึ่งในสายเหล่านั้นออกจากอาร์เรย์ ตอนนี้ฉันกำลังมองหาสตริงที่แตกต่างกันเพียง 1 ตัวอักษร แต่มันจะดีถ้าความแตกต่างของตัวละคร 1 ตัวนั้นสามารถเพิ่มขึ้นได้เช่น 2, 3 หรือ 4 ตัวอักษร อย่างไรก็ตามในกรณีนี้ฉันคิดว่าประสิทธิภาพสำคัญกว่าความสามารถในการเพิ่มขีดจำกัดความแตกต่างของตัวละคร kkkมักจะอยู่ในช่วง 20-40

2
เหตุใดจึงมีการมอบหมายให้ใช้แบบคงที่เดียวมากกว่ารูปแบบการส่งผ่านต่อเนื่องในคอมไพเลอร์ที่ใช้ในอุตสาหกรรมจำนวนมาก?
ตามหน้า Wikipedia เกี่ยวกับการกำหนดค่าคงที่เดียว (SSA) , SSA ถูกใช้โดยโครงการขนาดใหญ่และเป็นที่รู้จักเช่น LLVM, GCC, MSVC, Mono, Dalvik, SpiderMonkey และ V8 ในขณะที่หน้าโครงการที่ใช้รูปแบบการส่งต่อ (CPS)ขาดการเปรียบเทียบเล็กน้อย ฉันมีความเห็นว่า CPS เป็นที่ต้องการโดยผู้รวบรวมและล่ามที่ใช้ภาษาที่ใช้งานได้เป็นหลักโดยเฉพาะ Haskell และ Scheme ดูเหมือนจะมีความโน้มเอียงอย่างมากต่อรูปแบบ CPS เนื่องจากข้อ จำกัด เรื่องการกลายพันธุ์หรือความต้องการการสนับสนุนต่อเนื่องชั้นหนึ่ง Smalltalk นั้นอาจจะต้องการสิ่งนี้เช่นกัน) วรรณกรรมสำคัญที่ฉันพบว่าใช้ CPS ดูเหมือนว่าจะเป็นงานที่เกี่ยวกับ Scheme หรือเกี่ยวข้องกับ Scheme ในบางประเด็น มีเหตุผลใดที่ทำให้ SSA ถูกนำไปใช้ในอุตสาหกรรมนอกเหนือจากแรงผลักดันในการยอมรับ? SSA และ CPS มีความสัมพันธ์ใกล้ชิด นั่นหมายความว่ามันจะง่ายต่อการระบุในแง่อื่น แต่บางทีการแสดงข้อมูลจะมีขนาดเล็กลงหรือมีประสิทธิภาพน้อยกว่าสำหรับ CPS

2
ข้อเสียใดที่อนุญาตให้กำจัดหางแบบโมดูโลแบบเรียกซ้ำแบบหางได้?
ฉันคุ้นเคยกับแนวคิดของการกำจัดการเรียกซ้ำแบบหางพื้นฐานซึ่งฟังก์ชันที่ส่งคืนผลลัพธ์โดยตรงของการโทรหาตัวเองสามารถเขียนใหม่ได้เป็นลูปวนซ้ำ foo(...): # ... return foo(...) ฉันยังเข้าใจว่าเป็นกรณีพิเศษฟังก์ชั่นยังสามารถเขียนใหม่ถ้าโทร recursive consถูกห่อในการเรียกไปยัง foo(...): # ... return (..., foo(...)) คุณสมบัติอะไรที่consอนุญาตให้ทำเช่นนี้? ฟังก์ชั่นอื่นใดนอกจากconsสามารถตัดหางเรียกซ้ำโดยไม่ทำลายความสามารถของเราในการเขียนซ้ำซ้ำ? GCC (แต่ไม่ใช่เสียงดังกราว) สามารถเพิ่มประสิทธิภาพตัวอย่างนี้ของ "การคูณแบบโมดูโลแบบเรียกซ้ำหาง" แต่ก็ไม่มีความชัดเจนว่ากลไกใดที่อนุญาตให้ค้นพบสิ่งนี้หรือวิธีทำให้เกิดการเปลี่ยนแปลง pow(x, n): if n == 0: return 1 else if n == 1: return x else: return x * pow(x, n-1)

5
ทำไมการออกแบบระบบปฏิบัติการถึงสามารถลดการใช้พลังงานได้?
ฉันได้อ่านแล้วว่าระบบปฏิบัติการอย่าง Android และ iOS นั้นได้รับการปรับปรุงให้ดีขึ้นเพื่อปรับปรุงอายุการใช้งานแบตเตอรี่ ความเข้าใจของฉันคือ CPU ดำเนินการจำนวนหนึ่งในเวลาที่กำหนดดังนั้นฉันคิดว่าคุณสามารถเร่งความเร็วแอปพลิเคชันโดยลดจำนวนการดำเนินการที่ต้องการ แต่เนื่องจาก CPU จะยังคงทำงานxในเวลาyซึ่งไม่ควร ส่งผลกระทบต่อพลัง? นอกจากนี้หากกระบวนการใช้ RAM มากกว่าจะใช้พลังงานมากกว่าหรือไม่

1
Micro-optimization สำหรับการคำนวณระยะทางแก้ไข: ถูกต้องหรือไม่
บนWikipedia จะมีการติดตั้งชุดรูปแบบการเขียนโปรแกรมแบบไดนามิกจากล่างขึ้นบนสำหรับระยะแก้ไข ไม่ปฏิบัติตามคำจำกัดความอย่างสมบูรณ์ เซลล์ภายในจะถูกคำนวณดังนี้: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } อย่างที่คุณเห็นอัลกอริทึมจะเลือกค่าจากเพื่อนบ้านบนซ้ายถ้ามีการจับคู่การบันทึกการเข้าถึงหน่วยความจำการดำเนินการ ALU และการเปรียบเทียบ …

3
ความเท่าเทียมกันของการวิเคราะห์การไหลของข้อมูลการตีความเชิงนามธรรมและการอนุมานประเภท?
@ Babou ของคำตอบของคำถามที่ผ่านมาทำให้ผมนึกถึงว่าครั้งหนึ่งผมคิดว่าผมอ่านกระดาษเกี่ยวกับความเท่าเทียมกัน (ในแง่ทั้งข้อเท็จจริงที่ว่าจะสามารถสรุปหรือได้รับการพิสูจน์และความซับซ้อนเวลาของการทำงานขั้นตอนวิธีการอนุมาน) ของการวิเคราะห์ข้อมูลการไหล , การตีความที่เป็นนามธรรมและอนุมานชนิด ในบางกรณีย่อย (เช่นระหว่างการวิเคราะห์การไหลของข้อมูลระหว่างบริบทและการตีความนามธรรม) ความเท่าเทียมกันนั้นค่อนข้างชัดเจนสำหรับฉัน แต่คำถามดูเหมือนจะละเอียดกว่าสำหรับการเปรียบเทียบอื่น ๆ ตัวอย่างเช่นฉันไม่สามารถทราบได้ว่าการอนุมานประเภท Hindley-Milner สามารถใช้ในการพิสูจน์คุณสมบัติบางอย่างที่สามารถพิสูจน์ได้ด้วยการวิเคราะห์การไหลของข้อมูลที่มีความอ่อนไหวต่อการไหล อะไรคือการอ้างอิงน้ำเชื้อที่พูดถึงการเทียบเท่า (หรือความแตกต่าง) ระหว่างการวิเคราะห์การไหลของข้อมูลการตีความที่เป็นนามธรรมและการอนุมานประเภท?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.