การสะท้อนกลับ: การใช้การสะท้อนยังคง“ ไม่ดี” หรือ“ ช้า” หรือไม่? มีการเปลี่ยนแปลงอะไรกับการสะท้อนตั้งแต่ปี 2545


21

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

ถ้าหากมีอะไรเปลี่ยนแปลง มันเป็นเพียงความเร็วของเครื่องหรือไม่? มีการเปลี่ยนแปลงเฟรมเวิร์กเพื่อเร่งการสะท้อนหรือไม่?

หรือไม่มีอะไรเปลี่ยนแปลงจริง ๆ ? มันยังคง "แย่" หรือ "ช้า" เพื่อใช้การสะท้อน?


2
การสะท้อนกลับจะช้ากว่าการโทรโดยตรงเนื่องจากคุณต้องทำหลายขั้นตอนเพื่อค้นหาและตรวจสอบว่ามีสิ่งที่คุณโทรอยู่
Michael K

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

ทำการรีเฟลคชั่นด้วย gettype เพื่อดึงหนึ่งไอเท็มใน enum ยังเร็วกว่าการโยนข้อยกเว้นด้วย Enum.Parse () 30 เท่า ดังนั้นการสะท้อนกลับจึงชนะบางครั้ง
Brain2000

คำตอบ:


16

การสะท้อนนั้นไม่เลวหรือช้า มันเป็นเพียงเครื่องมือ เช่นเดียวกับเครื่องมือทั้งหมดมันมีค่ามากสำหรับบางสถานการณ์ แต่ไม่มีประโยชน์สำหรับผู้อื่น

หากประสิทธิภาพเป็นปัญหาคุณสามารถใช้ไลบรารีเช่นFasterFlect ได้ตลอดเวลา

อ่านเพิ่มเติม
หากการสะท้อนกลับไม่มีประสิทธิภาพเมื่อใดที่เหมาะสมที่สุด?


หรือdynamic- ลำดับความสำคัญเร็วกว่าการสะท้อน
Oded

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

3
@blesh: ไม่มีอะไร ผู้คนคุ้นเคยกับมันมากขึ้นในตอนนี้และกลัวน้อยลง
Robert Harvey

5
ฉันอาจจะทุกคน "ได้รับการปิดสนามหญ้าของฉัน" ที่นี่และบอกว่าเสียงกระเพื่อมมีนี้นานก่อนที่จะ OOP มีอยู่ ...
ไมเคิล K

ยุติธรรมพอสมควร ฉันแค่สงสัยว่ามันเป็นความเร็วที่เพิ่มขึ้นในเครื่องในช่วงสิบปีที่ผ่านมาซึ่งสร้างความแตกต่างหรือหากมีการเปลี่ยนแปลงจริง ๆ กับ System.Reflection ที่เพิ่มประสิทธิภาพ
blesh

17

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

การใช้การไตร่ตรองสมมติฐานที่สำคัญบางข้อที่ปกติแล้วเราสามารถทำได้เกี่ยวกับซอร์สโค้ดนั้นขาดและเครื่องมือต่าง ๆ เช่น "ค้นหาการอ้างอิงทั้งหมด" จะหยุดทำงานได้อย่างน่าเชื่อถือ การสะท้อนกลับยังลบความปลอดภัยส่วนใหญ่ที่คอมไพเลอร์บังคับใช้เช่น C # และข้อผิดพลาดในการเขียนโปรแกรมส่วนใหญ่ที่ระบบประเภทปกติจะตรวจจับและแปลเป็นข้อผิดพลาดของคอมไพเลอร์ตอนนี้กลายเป็นข้อผิดพลาดรันไทม์ที่ดีที่สุด

แล้วทำไมผู้คนถึงใช้การไตร่ตรอง? กล่าวง่ายๆเพราะแม้จะมีปัญหาตามที่อธิบายไว้ข้างต้นมันเป็นเครื่องมือที่มีค่ามาก ด้วยการไตร่ตรองประโยชน์บางประการของการเขียนโปรแกรมแบบไดนามิกสามารถเป็นภาษาแบบคงที่อย่างเคร่งครัดเช่น C # และภาษาโปรแกรมแบบไดนามิกได้แสดงให้เห็นประโยชน์ของพวกเขาเมื่อเร็ว ๆ นี้โดยเฉพาะอย่างยิ่งในขอบเขตของการเขียนโปรแกรมเว็บ - PHP, Javascript และ Python ใช้การพิมพ์แบบไดนามิกทั้งหมดและได้รับการพิสูจน์แล้วว่าเหมาะสำหรับการเขียนโปรแกรมเว็บ แต่เนื่องจากภาษายังคงเป็น C # คุณสามารถเลือกเก็บแอปพลิเคชันส่วนใหญ่ไว้ในสำนวน OOP ที่เคร่งครัดและเขียนส่วนเล็ก ๆ ที่พฤติกรรมแบบไดนามิกสร้างความแตกต่างด้วยการสะท้อน

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


13

การสะท้อนกลับยังช้ากว่าการโทรโดยตรงอย่างมาก มีการเปลี่ยนแปลงสองสิ่ง:

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

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


4
อนึ่งซีพียูช้าลง - โดยทั่วไปแล้วบนอุปกรณ์พกพาและเซิร์ฟเวอร์ที่ผู้คนพยายามบีบเอาประสิทธิภาพออกจากเซิร์ฟเวอร์ให้มากที่สุดเท่าที่จะเป็นไปได้เนื่องจากค่าใช้จ่ายในการใช้งาน
gbjbaanb

@gbjbaanb: ฉันจะให้อุปกรณ์มือถือของคุณ แต่บนเซิร์ฟเวอร์การซื้อฮาร์ดแวร์มากกว่าการเพิ่มประสิทธิภาพรหัสเป็นทางเลือกที่ได้รับการยอมรับและมีเหตุผลในกรณีส่วนใหญ่เนื่องจากค่าใช้จ่ายในการซื้อและเรียกใช้เซิร์ฟเวอร์นั้นต่ำกว่ามาก ค่าใช้จ่ายของรหัสการเพิ่มประสิทธิภาพ
Michael Borgwardt

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

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