如何解决使用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的来源,它正在访问slice的所有元素并分别调用clone
,而copy_from_slice直接复制memcpy
的所有位。
如果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
实现。对于基本类型(例如基元),优化器可能直接使用memcpy
而不是遍历,然后我们可能会认为此命题是错误的,因为一个将不如另一个更有效。 -
Clone
实现可以直接使用Copy
实现。对于复杂类型(上述遍历问题),此命题是正确的。 (我从@kmdreko编辑了example,其结构更加复杂,please check the result from godbolt) -
Clone
实现是自定义的,它是一种Copy
类型,即使使用copy
对于使用{{ 1}}可能会更有益。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。