'การเพิ่มประสิทธิภาพโค้ด' เมื่อใด == 'โครงสร้างข้อมูล' เมื่อใด


9

บทความล่าสุดโดย ycombinatorแสดงความคิดเห็นด้วยหลักการของโปรแกรมเมอร์ที่ยอดเยี่ยม

#7. โปรแกรมเมอร์ที่ดี: ฉันเพิ่มประสิทธิภาพรหัส โปรแกรมเมอร์ที่ดีกว่า: ฉันจัดโครงสร้างข้อมูล โปรแกรมเมอร์ที่ดีที่สุด: ความแตกต่างคืออะไร?

การยอมรับแนวคิดที่เป็นอัตนัยและเป็นที่ถกเถียงกัน - ไม่มีใครมีตำแหน่งในสิ่งนี้หมายความว่าอะไร? ฉันทำ แต่ฉันต้องการแก้ไขคำถามนี้ในภายหลังด้วยความคิดของฉันเพื่อไม่ให้คำตอบที่จูงใจ


2
รายการการอ้างอิงของคุณมีรายการดีๆอยู่ในนั้น ขอบคุณ
DeveloperDon

คำถามนี้ (ที่ฉันถาม) มีคำตอบที่กล่าวถึงคำพูดนี้เช่นกัน: programmers.stackexchange.com/q/168013/15028
TCSGrad

คำตอบ:


16

เก้าครั้งในสิบเมื่อคุณจัดโครงสร้างโค้ด / โมเดลของคุณได้ดีการปรับให้เหมาะสมจะชัดเจน มีกี่ครั้งที่คุณเห็นรังแตนและพบว่ามันไม่ดีอย่างสิ้นเชิงเมื่อทำการปรับโครงสร้างมันซ้ำซ้อนจำนวนมากก็ชัดเจนมาก

นักออกแบบรู้ว่าเขาบรรลุความสมบูรณ์แบบไม่ใช่เมื่อไม่มีอะไรเหลือให้เพิ่ม แต่เมื่อไม่มีอะไรเหลือให้นำออกไป - Antoine de Saint-Exupery

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

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

ที่กล่าวว่ามีความเป็นไปได้ที่แยกออกจากกันอย่างสิ้นเชิงและนี่อาจเป็นไปได้ว่าเพื่อนที่มีความสัมพันธ์กับ YCombinator อาจอ้างถึงข้อมูลรหัส AS ในประเพณี LISP ของ homoiconicity มันเป็นการยืดที่จะคาดเดาสิ่งนี้เป็นความหมายในใจของฉัน แต่มันเป็น YCombinator ดังนั้นฉันจะไม่ออกกฎที่อ้างว่าเพียงแค่พูดว่า LISPers เป็น "โปรแกรมเมอร์ที่ดีที่สุด"


1
สิ่งนี้ไม่ได้พูดกับ "ข้อมูล" และวิธี 'ไม่มีความแตกต่างระหว่างการปรับรหัสและโครงสร้างข้อมูล' รหัสการปรับให้เหมาะสมไม่ได้ปรับโครงสร้างข้อมูลที่ไม่ดีเว้นแต่ว่านี่เป็นเครื่องย่อยสลายตัวเองสมบูรณ์แบบเครื่องจักร
ซานเดรียใหม่

1
@NewAlexandria โมเดลที่กล่าวถึงคือ "data" บ่อยครั้งที่โค้ดไม่ดีและโมเดลที่ไม่ดีเข้ากัน การแก้ไขอย่างใดอย่างหนึ่งส่งผลให้การแก้ไขอื่น ๆ

1
@ NewAlexandria ฉันหมายถึงการสร้างแบบจำลองของคุณเป็นโครงสร้าง "ข้อมูล" จุดของฉันเป็นเพียงเกี่ยวกับการจัดโครงสร้างข้อมูล / รหัสมีความหมายเหมือนกันเพราะพวกเขาเป็นส่วนหนึ่งของระบบโดยรวมและพึ่งพาซึ่งกันและกัน หากต้องการโครงสร้างอย่างใดอย่างหนึ่งจะต้องมีการเปลี่ยนแปลงอื่น ๆ นี่อาจเป็นสิ่งที่คุณกำลังมองหา? ฉันพยายามอธิบายว่าโครงสร้างและการเพิ่มประสิทธิภาพเหมือนกันไม่ใช่รหัสและข้อมูลที่เกี่ยวข้องกันหรือไม่ฉันอาจเข้าใจผิดคำถามของคุณว่าเป็นส่วนที่ทำให้คุณสับสนหรือไม่
Jimmy Hoffa

ฉันคิดว่านี่เป็นสิ่งที่ใกล้เคียงที่สุดที่จะอธิบายความรู้สึกของหัวข้อที่ถูกต้อง ฉันรู้อย่างแน่นอนว่ามันใช้งานได้อย่างไร แต่หวังว่าจะมีคนเห็นบางสิ่งที่ลึกซึ้งยิ่งขึ้นในคำถามที่ฉันอ้างถึง
ซานเดรียใหม่

4

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

โปรดทราบว่า "โปรแกรมเมอร์ยอดเยี่ยม uber" อาจตอบกลับไปยัง "ความแตกต่างคืออะไร" มีความแตกต่างอยู่บ้าง: เมื่อคุณลองปรับการใช้ CPU แคชให้ดีขึ้นคุณอาจรักษาเลย์เอาต์ของโครงสร้างข้อมูลของคุณเหมือนเดิม แต่เปลี่ยนลำดับที่คุณเข้าถึงพวกเขาได้ ข้อแตกต่าง


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

บางครั้งการปรับโครงสร้างข้อมูลอนุญาตให้มีการปรับโครงสร้างโค้ด แต่บางครั้งฉันคิดว่าเมื่อคุณทำเสร็จแล้วรหัสใหม่นั้นมีรหัสทั่วไปน้อยมาก
DeveloperDon

OTOH การจัดแนวข้อมูลสำหรับขนาดแคชของบรรทัดสามารถมีผลกระทบอย่างมาก ;-p
Macke

3

พิจารณาตัวอย่างที่ชัดเจนที่สุดของเรื่องนี้ - "การค้นหาข้อมูลผู้ใช้ช้าเกินไป!"

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

โปรแกรมเมอร์เป็นนักแก้ปัญหา แม้ว่าจะมีประโยชน์ในการแยกความแตกต่างระหว่างอัลกอริทึมและโครงสร้างข้อมูล แต่ก็ไม่สามารถแยกได้ โปรแกรมเมอร์ที่ดีที่สุดรู้เรื่องนี้และอย่าแยกตัวเองโดยไม่จำเป็น


1

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

ฉันคิดว่าผู้เขียนควรเขียนส่วนสุดท้ายเป็น"โปรแกรมเมอร์ที่ดีที่สุด: ฉันปรับทั้งสองอย่าง"

: มีหนังสือที่ดี (อย่างน้อยก็ในเมื่อเผยแพร่) เรียกว่าเป็นโครงสร้างอัลกอริทึม + ข้อมูล = โปรแกรม


0

การเพิ่มประสิทธิภาพรหัสบางครั้งสามารถปรับปรุงความเร็วโดยสองเท่าและบางครั้งโดยปัจจัยสิบหรือยี่สิบ แต่ที่เกี่ยวกับมัน ซึ่งอาจฟังดูเยอะมากและถ้าใช้เวลาในการประมวลผลของโปรแกรม 75% ในรูทีนห้าบรรทัดซึ่งอาจเพิ่มความเร็วเป็นสองเท่าได้อย่างง่ายดายการเพิ่มประสิทธิภาพเช่นนี้อาจคุ้มค่า ในอีกทางหนึ่งการเลือกโครงสร้างข้อมูลอาจส่งผลกระทบต่อความเร็วในการประมวลผลตามคำสั่งขนาดใหญ่ หน่วยประมวลผลแบบมัลติเธรดที่ปรับให้ทันสมัยแบบไฮเปอร์ที่รันโค้ดที่ปรับปรุงประสิทธิภาพสูงสุดเพื่อค้นหาข้อมูลโดยใช้คีย์ในรายการลิงก์เชิงเส้น 10,000,000 รายการที่เก็บไว้ใน RAM จะช้ากว่าโปรเซสเซอร์ที่ทำงานช้ากว่ามาก อันที่จริงหากมีการจัดวางข้อมูลอย่างถูกต้องแม้แต่ปี 1980

ที่ได้รับการกล่าวว่าการออกแบบโครงสร้างข้อมูลที่มีประสิทธิภาพมักจะต้องมีการแลกเปลี่ยนที่ซับซ้อนกว่ารหัสการเพิ่มประสิทธิภาพ ตัวอย่างเช่นในหลายกรณีโครงสร้างข้อมูลที่อนุญาตให้เข้าถึงข้อมูลได้อย่างมีประสิทธิภาพมากที่สุดนั้นมีประสิทธิภาพน้อยกว่าในการอัปเดต (บางครั้งเรียงตามลำดับความสำคัญ) กว่าโครงสร้างที่อนุญาตการอัปเดตที่รวดเร็ว นอกจากนี้ในหลายกรณีโครงสร้างข้อมูลที่เหมาะสมที่สุดสำหรับชุดข้อมูลขนาดใหญ่อาจไม่มีประสิทธิภาพเมื่อเทียบกับชุดข้อมูลขนาดเล็ก โปรแกรมเมอร์ที่ดีควรพยายามสร้างความสมดุลให้กับปัจจัยการแข่งขันเหล่านั้นด้วยจำนวนเวลาโปรแกรมเมอร์ที่ต้องใช้ในการดำเนินการและบำรุงรักษาโครงสร้างข้อมูลต่าง ๆ และสามารถสร้างสมดุลที่เหมาะสมระหว่างพวกเขา


0

โครงสร้างข้อมูลขับเคลื่อนหลายสิ่งหลายอย่างที่เกี่ยวข้องกับประสิทธิภาพ ฉันคิดว่าเราสามารถดูปัญหาอย่างหนักและยาวนานด้วยแนวคิดที่คิดมาก่อนเกี่ยวกับโครงสร้างข้อมูลในอุดมคติและในบริบทของการคิดนี้แม้กระทั่งสร้างหลักฐาน (บ่อยครั้งจากการเหนี่ยวนำ) ของการมองโลกในแง่ดี ตัวอย่างเช่นถ้าเราใส่รายการที่เรียงลำดับไว้ในอาร์เรย์และประเมินสิ่งต่าง ๆ เช่นค่าใช้จ่ายในการแทรกองค์ประกอบเราอาจตัดสินใจโดยเฉลี่ยเราต้องเลื่อน 1/2 ของอาร์เรย์สำหรับการแทรกแต่ละครั้ง สำหรับการค้นหาไบนารีแต่ละครั้งเราสามารถค้นหารายการที่ตรงกัน (หรือไม่) ในขั้นตอน log n

อีกทางหนึ่งถ้าเราเลื่อนการตัดสินใจของเราเกี่ยวกับโครงสร้างข้อมูล (หลีกเลี่ยงการปรับให้เหมาะสมก่อนกำหนด ) และศึกษาข้อมูลที่เข้ามาและบริบทที่เราจะใช้มันจะมีขนาดใหญ่เท่าใดเวลาแฝงเกิดขึ้นและสิ่งใดที่สำคัญสำหรับผู้ใช้ เทียบกับจะใช้กับการแสดงข้อมูลที่เรารู้หรือสามารถประดิษฐ์ได้

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

โครงสร้างที่สร้างสรรค์ของข้อมูลสามารถช่วยแก้ปัญหาและเปิดประตูสู่อัลกอริธึมใหม่ที่ทำให้การใช้งานฮาร์ดเร็วขึ้นและบางครั้งก็เป็นไปไม่ได้


0

ที่จะเป็นปล้องเดาที่ดีที่สุดของฉันในสิ่งที่หมายถึงบทความผมจะถือว่าไม่ได้พูดความนัย (ซึ่งดูเหมือนว่าจะหายไปในบทความ) ที่ใด ๆโปรแกรมเมอร์ควรทำความเข้าใจเกี่ยวกับการเพิ่มประสิทธิภาพ:

  • การปรับให้เหมาะสมเกิดขึ้นหลังจากที่คุณได้เริ่มโปรแกรมและทำงานอย่างถูกต้องแล้ว:
    • ทำให้มันทำงานอย่างถูกต้องแล้วทำให้มันทำงานเร็ว
    • หลักการนี
  • หากและเมื่อคุณได้พิจารณาแล้วว่าการปรับให้เหมาะสมไม่ได้มาก่อนกำหนดคุณต้องวัดอย่างถูกต้องก่อนเพื่อพิจารณาว่าสิ่งที่ต้องการเพิ่มประสิทธิภาพจริง ๆ และอีกครั้งและอีกครั้งในระหว่างการปรับให้เหมาะสม
    • หากรหัสของคุณทำงานในการพัฒนาตัวสร้างโปรไฟล์คือเพื่อนของคุณในสิ่งนี้
    • หากรหัสของคุณทำงานได้คุณจะต้องใช้รหัสของคุณและเป็นเพื่อนกับระบบบันทึกของคุณแทน

ทีนี้การวัดของคุณจะบอกคุณว่าในเครื่องของคุณกำลังเขียนวงจรอะไร โปรแกรมเมอร์ที่ "ดี" จะเน้นไปที่การเพิ่มประสิทธิภาพส่วนต่าง ๆ ของรหัสแทนที่จะเสียเวลาในการปรับแต่งส่วนที่ไม่เกี่ยวข้อง

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

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


-1

โปรแกรมเมอร์ที่ดีที่สุด: ความแตกต่างคืออะไร?

โปรแกรมเมอร์ที่ดีที่สุด? ไม่ได้โปรแกรมเมอร์ Lousy ฉันสมมติว่าคำว่า "การเพิ่มประสิทธิภาพ" หมายถึงสิ่งที่ผู้เขียนโปรแกรมมักจะพยายามปรับให้เหมาะสมหน่วยความจำหรือเวลา CPU ในแง่นี้การปรับให้เหมาะสมจะเทียบกับเกรนของซอฟต์แวร์เมตริกเกือบทุกตัว ความเข้าใจความสามารถในการบำรุงรักษาความสามารถในการทดสอบและอื่น ๆ : สิ่งเหล่านี้ใช้เวลาสั้น ๆ เมื่อการปรับให้เหมาะสมเป็นเป้าหมาย - หากสิ่งที่พยายามเพิ่มประสิทธิภาพคือความเข้าใจของมนุษย์การบำรุงรักษาการทดสอบ ฯลฯ ไม่ต้องพูดถึงต้นทุน การเขียนอัลกอริธึมที่เหมาะสมที่สุดด้านความเร็ว / พื้นที่มีราคาสูงกว่าในแง่ของเวลาของนักพัฒนามากกว่าที่จะเขียนโค้ดอัลกอริทึมอย่างไร้เดียงสาตามที่แสดงในข้อความหรือวารสารบางส่วน โปรแกรมเมอร์หมัดไม่ทราบความแตกต่าง คนดีทำ โปรแกรมเมอร์ที่ดีที่สุดรู้วิธีการกำหนดสิ่งที่จำเป็นต้องปรับให้เหมาะสมและทำอย่างรอบคอบ

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