โปรแกรมเมอร์“ micro-optimization” สำหรับวันนี้ทำอะไร? [ปิด]


14

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

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

ตัวอย่างเช่น: โปรแกรมเมอร์เสียเวลาพูดคุยกับวิธีส่วนตัวที่เรียกจากที่เดียวหรือไม่? เสียเวลาลดข้อมูลกรณีทดสอบหรือไม่ โปรแกรมเมอร์ (ยัง) กังวลมากเกินไปเกี่ยวกับการลดบรรทัดของรหัส?

มีสองตัวอย่างที่ยอดเยี่ยมของสิ่งที่ฉันกำลังมองหาอยู่ด้านล่าง: (1) ใช้เวลาในการค้นหาชื่อตัวแปรที่เหมาะสมแม้กระทั่งเปลี่ยนชื่อทุกอย่าง และ (2) การลบรหัสซ้ำซ้อนแม้แต่น้อย


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



@ Macneil ฉันไม่ทราบว่าสิ่งที่โปรแกรมเมอร์ไมโครปรับให้เหมาะสม แต่ฉันไม่ได้มีเวลามากที่ เพื่อนร่วมงานของฉันก็ยุ่งเช่นกัน (แค่ 2 เซ็นต์ของฉัน)
งาน

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

1
คำถามที่ใช้คำพูดในปัจจุบันคือการปรับปรุง ฉันไม่สามารถลบคะแนนปิด แต่จะหมดอายุในอีกไม่กี่วัน จริงๆแล้วคำถามคือการดึงดูดคำตอบที่ดีงาม
Robert Harvey

1
BTW แนวปฏิบัติที่ดีที่สุดใด ๆสามารถนำไปสู่จุดสูงสุดที่ไม่ก่อให้เกิดมูลค่าอีกต่อไป
Robert Harvey

คำตอบ:


22

การจัดรูปแบบรหัส

Don't     get    me   wrong             ,
code      should be   consistent        & 
readable                                , 
but       some   take it         too far.

อาใช่ประเภทตัวแปรเก่าที่ดีและชื่อตัวแปรต้องการคอลัมน์ของตัวเองในชุดของการประกาศตัวแปร Oh! ลืมแถวพิเศษสำหรับแถว=ที่สี่สำหรับผู้เริ่มต้น!
Macneil

[Darn จะขึ้นคะแนน แต่ถึงขีด จำกัด รายวันของฉันแล้ว ... ]
Macneil

3
อาจารย์ของเราบังคับให้เราจัดรูปแบบรหัสสำหรับการมอบหมายแบบนี้ เอาฉันปีเพื่อกำจัดนิสัยนี้
Oliver Weiler

โอ้ที่รัก ในคำตอบอื่น ๆ ฉันหัวเราะ แต่อันนี้เจ็บจริงๆ :-(
Steve314

2
+1 ผมเคยทำงานร่วมกับห้องสมุดที่นักพัฒนาปฏิเสธที่จะให้รหัสของเขา const ที่ถูกต้องเพราะมันเมาขึ้นรหัสคอลัมน์รูปแบบของเขา ...
คณบดีฮาร์ดิง

20

ฉันเคยเขียนแอสเซมเบลอร์กลับมามากในวันนั้น ไม่ใช่ว่าคอมไพเลอร์จะได้รับที่ดีขึ้น แต่ในขณะนี้ฮาร์ดแวร์ส่วนใหญ่มีตรรกะจำนวนมากที่อุทิศให้กับการประมวลผลโค้ดที่ผิดปกติ ปัญหาไมโครจริงคือการตั้งเวลาคำสั่งคอมพิวเตอร์ส่วนใหญ่ใช้นาฬิกาเครื่องหลายเครื่องเพื่อสร้างผลลัพธ์ - และโหลดหน่วยความจำที่พลาดแคชอาจใช้เวลาหลายร้อย! ดังนั้นความคิดคือการกำหนดเวลาคำแนะนำอื่น ๆ เพื่อทำสิ่งที่มีประโยชน์แทนการรอผล และเครื่องจักรที่ทันสมัยสามารถออกคำสั่งหลายต่อเวลานาฬิกา เมื่อเราเริ่มได้รับการบังคับให้ทำตามคำสั่ง HW ฉันพบว่าการพยายามทำให้ได้ประสิทธิภาพที่ยอดเยี่ยมด้วยการเข้ารหัสด้วยมือกลายเป็นเกมแก้ว ก่อนอื่น HW ที่ไม่ได้ทำตามคำสั่งจะไม่ดำเนินการตามคำสั่งตามคำสั่งของคุณอย่างระมัดระวัง สถาปัตยกรรม HW ใหม่ที่แปลกใหม่ได้ลดโทษของการจัดตารางเวลาซอฟต์แวร์ที่ไม่เหมาะสมพอที่คอมไพเลอร์มักจะอยู่ภายในไม่กี่เปอร์เซ็นต์ของประสิทธิภาพการทำงานของคุณ นอกจากนี้ฉันพบว่าคอมไพเลอร์กำลังใช้เทคนิคที่เป็นที่รู้จักกันดี แต่ความซับซ้อนในการสร้างเช่นการคลี่, การโหลดด้านล่าง, ไพพ์ไลน์ซอฟต์แวร์ ฯลฯ บรรทัดล่างคุณต้องทำงานอย่างหนักจริงๆข้ามเทคนิคเหล่านี้และคอมไพเลอร์ชนะคุณ ใช้พวกเขาทั้งหมดและจำนวนคำสั่งแอสเซมเบลอร์ที่คุณต้องการเพิ่มขึ้นหลายเท่า!

อาจมีความสำคัญมากขึ้นและปัญหาประสิทธิภาพส่วนใหญ่ไม่ได้เกี่ยวกับอัตราปัญหาการเรียนการสอน แต่การได้รับข้อมูลเข้าสู่ซีพียู ดังที่ฉันได้กล่าวไว้ข้างต้นเวลาในการตอบสนองของหน่วยความจำตอนนี้นับร้อยรอบและ CPU สามารถดำเนินการหลายคำสั่งต่อรอบนาฬิกาดังนั้นหากโปรแกรม - และโดยเฉพาะอย่างยิ่งโครงสร้างข้อมูลได้รับการออกแบบเพื่อให้อัตราการเข้าชมแคชสูง ระดับจะไม่มีผลตอบแทน เช่นเดียวกับประเภททหารพูดว่ามือสมัครเล่นพูดคุยกลยุทธ์มืออาชีพพูดคุยโลจิสติก การเขียนโปรแกรมประสิทธิภาพตอนนี้มากกว่า 90% โลจิสติกส์ (ย้ายข้อมูล) และนี่เป็นเรื่องยากที่จะหาปริมาณเนื่องจากการจัดการหน่วยความจำที่ทันสมัยมีแคชหลายระดับและหน้าหน่วยความจำเสมือนได้รับการจัดการโดยหน่วยฮาร์ดแวร์ที่เรียกว่า TLB การจัดตำแหน่งที่อยู่ระดับล่างให้มีความสำคัญเช่นเดียวกับการถ่ายโอนข้อมูลจริงไม่ได้อยู่ในหน่วยไบต์ หรือแม้กระทั่ง 64 บิตยาว แต่พวกเขามาในหน่วยของสายแคช จากนั้นเครื่องจักรที่ทันสมัยส่วนใหญ่จะมีฮาร์ดแวร์ที่พยายามคาดเดาว่าคุณจะต้องใช้แคชสายใดในอนาคตอันใกล้นี้และออก prefetches อัตโนมัติเพื่อนำไปไว้ในแคช ดังนั้นความจริงก็คือด้วยโมเดลประสิทธิภาพของ CPU สมัยใหม่นั้นซับซ้อนจนแทบจะไม่เข้าใจเลย แม้แต่ตัวจำลองฮาร์ดแวร์ที่มีรายละเอียดก็ไม่สามารถเทียบได้กับตรรกะที่แน่นอนของชิปดังนั้นการปรับที่แม่นยำจึงเป็นไปไม่ได้อีกต่อไป

ยังมีสถานที่สำหรับการเขียนโปรแกรมด้วยมือบางส่วน ห้องสมุดคณิตศาสตร์ (เช่นฟังก์ชั่นบอกว่า exp) เช่นเดียวกับการดำเนินงานพีชคณิตเชิงเส้นที่สำคัญกว่า (เช่นเมทริกซ์ทวีคูณ) ยังคงเขียนด้วยมือโดยผู้เชี่ยวชาญที่ทำงานให้กับผู้จำหน่ายฮาร์ดแวร์ (เช่น Intel หรือ AMD หรือ IBM) แต่พวกเขาอาจ ต้องการโปรแกรมเมอร์โปรแกรมเมอร์แอสเซมเบลอร์ตัวต่อสองตัวต่อคอร์ปคอมพิวเตอร์ขนาดใหญ่


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

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

10

บางครั้งฉันใช้เวลา (เสียเวลา) ในขณะที่เลือกชื่อที่ดีสำหรับตัวแปรหรือวิธีการเพื่อไม่เพียง แต่อธิบายอย่างแม่นยำ แต่ยังมีสไตล์ภาษาที่ดีด้วย

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

ไม่ว่ามันต้องใช้เวลามาก มันค่อนข้างหายาก แต่ฉันชอบที่จะรักษาไวยากรณ์ที่ดีในโปรแกรมของฉัน


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

1
นี่เป็นสิ่งที่มีสติมากเหลือเกิน (สมองด้านซ้ายของคุณรับผิดชอบในการประมวลผลภาษา) ในฐานะโปรแกรมเมอร์ที่มีสติปัญญาฉันมักจะใช้เวลาน้อยลงที่จะกังวลเกี่ยวกับความหมายและมีเวลามากขึ้นที่จะกังวลว่าชิ้นส่วนทั้งหมดเข้ากันได้อย่างไร
Jason Baker

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

@grandmaster: ไม่เห็นด้วยมากขึ้น
Robert Harvey

4
@ right-brainers: โปรดระบุรหัสสำหรับ lef-tbrainers ดังนั้นฉันจึงสามารถอ่านรหัสของคุณได้ด้วย
Juan Mendes

10

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

ฉันแค่มัว แต่มัวเมาที่จะละทิ้ง 'แต่มันอาจทำให้กระดูกใหญ่โต' แม้ว่าการตัดสินใจการออกแบบอื่น ๆ จะขัดขวางไม่ให้เกิดขึ้นจริง

อย่างไรก็ตามในการป้องกันของฉันควรเป็นจริงไม่สมจริง .. การเพิ่มประสิทธิภาพจริงๆไม่ 'micro' อีกต่อไป หมายเหตุผมไม่ได้บอกว่าเป็นไปไม่ได้แต่ไม่สมจริง

แน่นอนว่าความต้องการมาก่อน


1
ฉันทำงานให้กับ บริษัท ที่จมลงเพราะเหตุนี้
เฮนรี่

2
@Henry - ฉันสัญญาไม่ใช่ฉัน :)
Tim Post

1
@Henry: คุณหมายถึงพวกเขาเสียเวลาในการปรับให้เหมาะสมสำหรับสิ่งที่อาจไม่เคยเกิดขึ้นหรือพวกเขาไม่ได้คิดเกี่ยวกับสิ่งที่น่าจะ "ไม่" เกิดขึ้น ... จนกว่าพวกเขาจะเกิดขึ้นและมันก็สายเกินไป?
Dean Harding

2
@Henry: หาก บริษัท มีผลิตภัณฑ์ที่ปรับขนาดได้สูงและยังคงจมอยู่ก็เป็นความผิดของฝ่ายขายและการตลาด
ร. ว.

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

8

ฉันคิดว่าฉันเสียเวลาหลายสัปดาห์ในการจัดการกับตัวจัดการข้อยกเว้นของ Java

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

สะดือจำนวนมากจ้องมองและพูดคุยเกี่ยวกับลักษณะของข้อผิดพลาด IO หากคุณไม่สามารถอ่านไฟล์ผ่านเครือข่ายมันเป็นข้อผิดพลาดของไฟล์หรือข้อผิดพลาดของเครือข่าย? และอื่น ๆ

ณ จุดหนึ่งฉันแทนที่สตริง concat ทั้งหมดด้วยString.formatดังนั้นข้อผิดพลาดไฟล์รายปีจะไม่ส่งผลให้มีวัตถุพิเศษในฮีป นั่นคือขยะ


3
นี่คืองานที่สำคัญ ราคาของความล้มเหลว = ข้อความแสดงข้อผิดพลาดของคุณถูกแสดงบน WTF รายวัน
Steve314

7

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


4
+1 สำหรับ "ฉันแพ้รหัสซ้ำ" ดูคำตอบของฉันได้ที่นี่: programmers.stackexchange.com/questions/14610/…
Macneil

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

5

การอ่านไฟล์ทีละบรรทัดแทนการอ่านทั้งบรรทัดลงในสตริงและประมวลผลสตริงในหนึ่งครั้ง

แน่นอนว่ามันสร้างความแตกต่างในความเร็วในการดำเนินการ แต่ไม่ค่อยคุ้มกับรหัสของบรรทัดเพิ่มเติม มันทำให้รหัสบำรุงรักษาน้อยลงและเพิ่มขนาดรหัส

ใช่สิ่งนี้อาจไม่สมเหตุสมผลหากไฟล์มีขนาดใหญ่ 3GB แต่ไฟล์ส่วนใหญ่ไม่ใหญ่ (อย่างน้อยก็ไม่ใช่ไฟล์ที่ฉันใช้ด้วย ;-))


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

3

เมื่อฉันเขียนภาษาแอสเซมบลีมันสมเหตุสมผลที่จะ nitpick กว่าไบต์และรอบ แต่นั่นเป็นเวลานานที่ผ่านมาและคอมไพเลอร์มาไกลตั้งแต่นั้นมา ฉันจะไม่พยายามเพิ่มประสิทธิภาพด้วยตนเองตอนนี้

ในทำนองเดียวกันเมื่อฉันเปลี่ยนไปใช้การเขียนใน C มันค่อนข้างง่ายที่จะทำงานได้ดีกว่าคอมไพเลอร์ C แต่ทุก ๆ ปี Borland หรือ Microsoft หรือใครบางคนจะปล่อยตัวใหม่ที่ปรับปรุงใหม่ซึ่งเตะหน้าที่ก่อนหน้านี้รอบห้อง ฉันเริ่มให้ความสนใจกับรหัสแอสเซมบลีจริงที่คอมไพเลอร์ถูกเปล่งและ danged ถ้ามันไม่ได้เขียนรหัสที่ดีและแน่นบางลูป unrolling ลูปตัวแปรย้ายนอกลูป ฯลฯ

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

โดยทั่วไปฉันพยายามฉลาดในการเขียนโค้ดตามประสบการณ์หลายปี


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

3

การเพิ่มประสิทธิภาพขนาดเล็ก: ปรับปรุงประสิทธิภาพเธรดเดี่ยวของสิ่งต่าง ๆ ที่ขนานได้หรือสามารถปรับปรุงได้ด้วยฮาร์ดแวร์ใหม่

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


2

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

นอกเหนือจากนั้นฉันยังเห็นโปรแกรมเมอร์ micro-optimization เพื่อความเรียบง่าย (รวมถึงตัวเอง) ฉันยังไม่ได้ไปทำงานที่ไหนสักแห่งที่ฉันไม่ต้องอธิบายความแตกต่างระหว่างความเรียบง่ายและความเรียบง่าย


ทำไมโปรแกรมเมอร์ จะแตกต่างกันอย่างไร อะไรคือสิ่งที่แตกต่างโปรด
Dan Rosenstark

@Yar - ทำไมโปรแกรมเมอร์จะแตกต่างจากอะไร
Jason Baker

ทำไมprogrammers.= programmers.stackexchange.comจะแตกต่างจากทุกที่ที่คุณทำงานซึ่งคุณต้องอธิบายความแตกต่างระหว่างแนวคิดทั้งสองนี้ กรุณาอธิบายความแตกต่าง
Dan Rosenstark

@Yar - ฉันไม่รู้ว่ามันจะ ในความเป็นจริงในฐานะที่เป็นจุดสำคัญของ programmers.se ก็คือเพื่อช่วยให้นักเขียนโปรแกรมมีความรู้มากขึ้นฉันหวังว่าจะไม่เป็นเช่นนั้น
Jason Baker

2
ดังนั้นความแตกต่างของความเรียบง่ายและความเรียบง่ายคืออะไร b / t?
Dan Rosenstark

2

ฉันทุกคนมีหลักการที่ไม่ต้องปรับให้เหมาะสมเว้นแต่จะจำเป็นจริงๆ และฉันทั้งหมดสำหรับหลักการโปรไฟล์แรก และโดยหลักการแล้วฉันจะปรับสิ่งที่จะสร้างความแตกต่างที่จำเป็นเท่านั้น

นั่นเป็นหลักการ แต่หลักการเป็นคนโกหก

ฉันมีนิสัยในการดูแลฟังก์ชั่นในห้องสมุดที่ใช้บ่อยซึ่งฉันคิดว่าจะใช้เป็นวงใน และเมื่อคุณเห็นบางสิ่งในฟังก์ชั่นอื่นมันไม่ได้ใช้บ่อย ...

โอ้ - แล้วมี "ฉันกำลังเขียน - แน่นอนมันเป็นห้องสมุดที่สำคัญ" ตรรกะ

โอ้ - และ BTW ฉันยังไม่เคยใช้ profiler เพื่อเป็นแนวทางในการปรับให้เหมาะสม ไม่สามารถเข้าถึงโฆษณาและไม่เคยสร้างแรงจูงใจในการคิดหา gprof

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

ฉันไม่ได้เลวร้ายอย่างที่คิดไว้ที่นี่ และฉันมีภูมิคุ้มกันต่อการหลอกลวงตัวเองอย่างสมบูรณ์ดังนั้นคุณจึงรู้ว่าฉันพูดถูก!

แก้ไข

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


+1 อ้าใช่! คลาสนี้แยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งที่เจาะจงและแปลกประหลาดของแอปพลิเคชันของฉัน แต่ให้ฉันจัดรูปแบบและจัดทำเอกสารทั้งหมดเมื่อ Javadoc เพราะแน่นอนว่าคนอื่นจะใช้สิ่งนี้เป็นเวลาหลายปี! [จะต้องเพิ่มคะแนนในภายหลัง, ถึงกำหนดรายวันของฉันแล้ว]
Macneil

@ Macneil - นั่นคือ Doxygen ฉันจะให้คุณรู้ ด้วยตัวเลือกทุกตัวฉันสามารถเปิดสวิตช์ได้ดังนั้นทุกฟังก์ชั่นเล็ก ๆ จะได้รับ "เอกสาร" ในรายละเอียดที่น่าตื่นตาพร้อมกราฟ GraphViz สวย ๆ จำนวนโหล ช่วยให้ทุกคนชื่นชมว่ารหัสของฉันสำคัญเพียงใดและการพิมพ์ภาพพื้นหลังนั้นสามารถเป็นบล็อกสำนักงานขนาดใหญ่ได้
Steve314

1

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

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

แต่ฉันกำลังมองหาสิ่งที่โปรแกรมเมอร์ทำเพื่อไม่ให้เสียเวลา

Twitter และ Facebook ต้องคิดในใจ :-)


สวัสดีสตีเฟ่นนั่นเป็นคำอธิบายที่ยอดเยี่ยมเกี่ยวกับการเพิ่มประสิทธิภาพขนาดเล็ก แต่คุณเห็นสิ่งที่เทียบเท่ากับยุคใหม่หรือไม่? [Facebook และ Twitter ไม่ใช่ "แนวทางปฏิบัติที่ดีที่สุด" ที่สามารถดำเนินการได้ไกลเกินไป]
Macneil

มันยังคงสมเหตุสมผล เวลาของนาฬิกาอาจมีขนาดเล็กกว่าคำสั่ง แต่รหัสคือขนาดของคำสั่งที่ใหญ่กว่า ...
hplbsh

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