Copy_from_slice () yerine clone_from_slice () kullanmanın performans cezası?
Rust'ta, bir dilimin içeriğini başka bir dilimden güncellemenin iki yöntemi vardır: clone_from_slice()ve copy_from_slice(). Bu iki işlevin davranışı şaşırtıcı değildir - birincisi bir klon yapar ve türün uygulanmasını Clone
beklerken, ikincisi bir kopya yapar ve türün uygulanmasını bekler Copy
.
Bununla birlikte, belgelerin şunu belirtmesi beni şaşırtıyor clone_from_slice
: "Eğer T
uygularsa Copy
, kullanımı daha performanslı olabilir copy_from_slice
." Burada bir performans farkı olması şaşırtıcı. Eğer T
uygularsa Copy
, .clone()
bitleri kopyalamaya eşdeğer olması gerekir; ancak derleyici türünün ne olduğunu bildiğinden T
, kullansam bile bitsel bir kopya yapıp yapamayacağını anlayabilmelidir clone_from_slice
.
Peki, performans verimsizliği nereden kaynaklanıyor?
Yanıtlar
TL; DR Lütfen clone_from_slice'ın kaynağını kontrol edin, dilimin tüm öğelerini ziyaret ediyor ve clone
her biri için çağırıyor , copy_from_slice ise tüm bitleri doğrudan kopyalar memcpy
.
T uygularsa
Copy
,.clone()
bitleri kopyalamaya eşdeğer olması gerekir
Her Copy
tür, Clone
varsayılan clone
olarakcopy
; clone_from_slice
yine de dilimi çapraz geçecek ve çapraz geçiş sırasında kopyalama yapacak.
Fakat bu önerme ilkel ifadeler için doğru değil, aşağıdaki gibi durumlar için doğru değildir :
#[derive(Copy)]
struct X;
impl Clone for X {
fn clone(&self) -> Self {
//do some heavy operation or light(depends on the logic)
X
}
}
Bununla birlikte Clone
, herhangi bir mantık Copy
türü tarafından uygulanabilir, bir nesneyi çoğaltırken basitçe bitleri kopyalayacaktır.
T uygularsa
Copy
, kullanmak daha performanslı olabilircopy_from_slice
Önemli olan burada mı, dokümantasyon "diyor olabilir ki " değil " öyle olacak ", böyle olanaklarını getiriyor
Clone
uygulama, uygulamayı doğrudan kullanabilirCopy
. İlkel türler gibi temel türler için, optimize edicimemcpy
, geçiş yapmak yerine doğrudan kullanabilir , bu durumda bu önermeyi yanlış kabul edebiliriz, çünkü biri diğerinden daha performanslı olmayacaktır.Clone
uygulama, uygulamayı doğrudan kullanabilirCopy
. Karmaşık türler için (yukarıdaki çaprazlama sorunu) bu önermeyi doğru yapar. ( @Kmdreko'daki örneği biraz daha karmaşık bir yapıyla düzenledim , lütfen godbolt'un sonucunu kontrol edin )Clone
uygulama özeldir ve birCopy
türdür, bu, özel uygulama ucuz olsa bile bu önermeyi doğru yapar, o zamancopy
büyük dilimler için kullanmakmemcpy
daha faydalı olabilir.