โทษประสิทธิภาพของการใช้ clone_from_slice () แทน copy_from_slice ()?
ใน Rust มีสองวิธีการในการปรับปรุงเนื้อหาของชิ้นจากชิ้นอื่นนี้และclone_from_slice() copy_from_slice()พฤติกรรมของทั้งสองฟังก์ชั่นที่มีความแปลกใจเลย - ครั้งแรกที่ไม่โคลนและคาดว่าประเภทที่จะดำเนินการในขณะที่สองไม่สำเนาและคาดว่าประเภทที่จะดำเนินการClone
Copy
อย่างไรก็ตามฉันประหลาดใจที่เอกสารประกอบclone_from_slice
ระบุว่า: "หากมีT
การใช้งานCopy
ก็สามารถใช้งานได้copy_from_slice
ดีกว่า" เป็นที่น่าแปลกใจที่ควรมีความแตกต่างด้านประสิทธิภาพที่นี่ หากT
ดำเนินการCopy
แล้ว.clone()
จะต้องเทียบเท่ากับการคัดลอกบิต; อย่างไรก็ตามเนื่องจากคอมไพเลอร์รู้ว่าประเภทT
ใดจึงควรจะสามารถทราบได้ว่าสามารถทำสำเนาบิตได้หรือไม่แม้ว่าฉันจะใช้clone_from_slice
.
แล้วความไม่มีประสิทธิภาพเกิดขึ้นจากไหน?
คำตอบ
TL; DRโปรดตรวจสอบแหล่งที่มาของclone_from_sliceก็จะเข้ามาเยี่ยมชมทุกองค์ประกอบของชิ้นและเรียกclone
สำหรับแต่ละขณะcopy_from_slicememcpy
สำเนาโดยตรงบิตทั้งหมดที่มี
ถ้า T ดำเนินการ
Copy
แล้ว.clone()
จะต้องเทียบเท่ากับบิตการคัดลอก
แม้ว่าทุกCopy
ประเภทจะใช้งานClone
ตามค่าเริ่มต้นโดยclone
ใช้ปุ่มcopy
; clone_from_slice
จะยังคงสำรวจชิ้นส่วนและทำสำเนาในขณะที่ข้ามผ่าน
แต่ไม่มีข้อเสนอนี้ถูกต้องสำหรับสิ่งดั้งเดิม แต่ไม่ถูกต้องสำหรับกรณีต่อไปนี้ :
#[derive(Copy)]
struct X;
impl Clone for X {
fn clone(&self) -> Self {
//do some heavy operation or light(depends on the logic)
X
}
}
ในขณะที่Clone
สามารถใช้งานได้โดยตรรกะทุกCopy
ประเภทจะคัดลอกบิตเมื่อทำซ้ำวัตถุ
หากใช้ T
Copy
ก็สามารถใช้งานได้ดีขึ้นcopy_from_slice
สิ่งสำคัญอยู่ที่นี่เอกสารระบุว่า " มันสามารถ " ไม่ " มันจะเป็น " ซึ่งนำมาซึ่งความเป็นไปได้เช่น
Clone
การนำไปใช้โดยตรงสามารถใช้Copy
การนำไปใช้งานได้ สำหรับประเภทพื้นฐานเช่น primitives เครื่องมือเพิ่มประสิทธิภาพอาจใช้memcpy
แทนการข้ามผ่านโดยตรงจากนั้นเราอาจยอมรับว่าข้อเสนอนี้ผิดเพราะจะไม่มีประสิทธิภาพClone
การนำไปใช้โดยตรงสามารถใช้Copy
การนำไปใช้งานได้ สำหรับประเภทที่ซับซ้อน (ปัญหาการข้ามผ่านด้านบน) ทำให้ประพจน์นี้ถูกต้อง (ฉันแก้ไขตัวอย่างจาก @kmdreko ด้วยโครงสร้างที่ซับซ้อนขึ้นเล็กน้อยโปรดตรวจสอบผลลัพธ์จาก godbolt )Clone
การใช้งานเป็นแบบกำหนดเองและเป็นCopy
ประเภทข้อนี้จะทำให้ข้อเสนอนี้ถูกต้องแม้การใช้งานแบบกำหนดเองจะมีราคาไม่แพงcopy
สำหรับชิ้นส่วนขนาดใหญ่ที่ใช้memcpy
อาจมีประโยชน์มากกว่า