在Rust中设置对象参数的性能[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Rust中设置对象参数的性能[关闭]相关的知识,希望对你有一定的参考价值。
我一直想知道到目前为止我在Rust中遇到的不同实例化结构的方法。因此,当所有内容都是公共的时,有最基本/最简单的方法来手动设置所有字段:
let a = Structure { arg1: T, arg2: T, ... }
当需要隐私和更好的界面和/或默认值时,通常使用'contructors',例如new new()等:
let a = Structure::new(arg1, arg2, ...)
现在,到目前为止,这对我来说是有道理的。然而,似乎有第三种常见的做法同样让我感到困惑。这是一个具体的例子:
let mut image_file = OpenOptions::new()
.write(true)
.truncate(true)
.create(true)
.open(file_path)
.unwrap();
所以我的问题是:
- 这些不同解决方案(如果有)的性能影响是什么?
- 各自的一般利弊是什么?
- 还有更多的方法可以做同样的事情吗?
- 哪种是最佳做法?
您已经确定了3种创建struct
的方法:
- 直接:直接初始化其字段,
- 构造函数:调用一个初始化
struct
的函数, - 建造者:组装
struct
元素,然后最终初始化struct
。
还有更多的方法可以做同样的事情吗?
直接初始化有两种变化:要么直接初始化每个字段,要么初始化几个字段,用struct S { f0, .. OTHERS }
“默认”其他字段,其中OTHERS
是S
的一个实例。
构造函数和构建器方式具有指数变化,具体取决于您对参数进行分组的方式,在某些情况下,两者之间的线条将模糊。
但是,所有方法都必须在某一点上收敛并使用(1)来创建S
的实例。
各自的一般利弊是什么?
这在某种程度上是无关紧要的。
3种替代方案中的每一种都满足不同的需求:
- 直接初始化需要可访问字段因为
pub
油田很少见,所以它主要用在箱子里但不能被客户使用。 - 构造函数和构建器允许建立不变量,因此是主客户端的接口。
构造函数很简单但不灵活:在不破坏向后兼容性的情况下,不能添加新参数(当然,另一个构造函数可以);另一方面,生成器是灵活的,代价是冗长。
这些不同解决方案(如果有)的性能影响是什么?
理想情况下,在优化的二进制文件中,构造函数和构建器应具有相同的成本。如果重要,请说明。
直接初始化将比它们建立不变量时更快,因为它不会。比较非等效功能的性能虽然很重要。
哪种是最佳做法?
避免直接初始化。
直接初始化不会建立不变量,由周围的代码来建立不变量,这意味着任何时候使用直接初始化都会复制不变的检查代码,这违反了DRY原则。
直接初始化也违反封装,防止底层结构的任何进一步更改,直到所用字段的类型。这通常是不合需要的。
像往常一样有例外。最重要的是实现构造函数或构建器需要使用直接初始化。
在Constructor和Builder之间进行选择更为主观。一般来说,我推荐一个Constructor,当参数很少时,即使这意味着写一些它们,例如Vec::{new, with_capacity}
。如果需要为每个有意义的参数组合编写一个构造函数,那么当构造函数的数量失控时,请使用Builder。
以上是关于在Rust中设置对象参数的性能[关闭]的主要内容,如果未能解决你的问题,请参考以下文章