水木社区手机版
首页
|版面-编程技术(Programming)|
新版wap站已上线
返回
下页
|
尾页
|
1/3
|
转到
主题:请教个rust基本问题,Rc<RefCell<T>>有啥坏处?
楼主
|
beep
|
2021-12-04 00:12:46
|
展开
团队正在迁往rust,有两种关于数据结构风格的意见:
1. 按照螃蟹书的风格建议,既然使用了rust,就需要先费心根据需求设计好所有权树,尽量少用Rc<RefCell<T>>,多用&和&mut解决问题
2. 因为业务需求变化不可预测,现在设计的所有权树不一定适应将来的需求,比如一个所有权树的根,将来要变成Rc多个主体拥有,哪个主体先死都不一定,那么现在就尽量多使用Rc<RefCell<T>>,其实就是把rust当作python来用,大部分重要的数据结构变量都进堆,都用Rc保证可以随便传递和复制所有权,都用RefCell来保证随时可borrow_mut,可写。而且不需要费心考虑所有权和引用规则的问题,虽然写起来罗嗦点,但是其实心智负担更轻。
我先自己说几个已知的Rc<RefCell<T>>的缺点:
a. 增加一些运行时的损耗,尤其是并行化映射为arc+rwlock之后运行时成本更严重,锁冲
突可能很严重;
b. 一些借用规则方面的错误被推迟到运行时panic才能暴露,debug起来比较困难;
c. RefCell的borrow和borrow_mut只基于{}block作用域分析,不支持NLL非词法生命期,所
以有时候需要手写额外的{}。
除此之外还有什么坑吗?
--
修改:beep FROM 123.120.160.*
FROM 123.120.160.*
3楼
|
beep
|
2021-12-04 10:17:55
|
展开
多谢!学习一下
【 在 z16166 (Netguy) 的大作中提到: 】
: Rc<RefCell<T>>搞定不了循环引用。
: 这些帖子里有些观点感觉很不错
:
https://users.rust-lang.org/t/why-do-all-docs-say-refcell-is-bad/37086
: ...................
--
FROM 123.120.160.*
4楼
|
beep
|
2021-12-04 10:18:13
|
展开
不是设计通用基础数据结构,是业务数据需要的特定结构
【 在 DreamDreams (光风霁月) 的大作中提到: 】
: 难道不是Rust新手先别自己设计树这类数据结构的实现么,标注库里不是有么。
--
FROM 123.120.160.*
6楼
|
beep
|
2021-12-04 11:06:38
|
展开
我先自己说几个已知的Rc<RefCell<T>>的缺点:
a. 增加一些运行时的损耗,尤其是并行化映射为arc+rwlock之后运行时成本更严重,锁冲突可能很严重;
b. 一些借用规则方面的错误被推迟到运行时panic才能暴露,debug起来比较困难;
c. RefCell的borrow和borrow_mut只基于{}block作用域分析,不支持NLL非词法生命期,所以有时候需要手写额外的{}。
除此之外还有什么坑吗?
【 在 z16166 (Netguy) 的大作中提到: 】
: 标 题: Re: 请教个rust基本问题,Rc<RefCell<T>>有啥坏处?
: 发信站: 水木社区 (Sat Dec 4 02:52:47 2021), 站内
:
: Rc<RefCell<T>>搞定不了循环引用。
:
: 这些帖子里有些观点感觉很不错
:
https://users.rust-lang.org/t/why-do-all-docs-say-refcell-is-bad/37086
:
https://users.rust-lang.org/t/if-you-use-enough-rc-refcell-t-does-rust-become-a-garbage-collected-language/61152/7
:
https://www.reddit.com/r/rust/comments/8jd43f/ownership_and_data_structures_that_arent_trees/
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net
·[FROM: 114.245.195.*]
--
FROM 123.120.160.*
10楼
|
beep
|
2021-12-04 18:52:36
|
展开
oreily那本
【 在 KEILLY (米饭) 的大作中提到: 】
: 哪本叫螃蟹书?
: 发现大部分rust的书,封面都是螃蟹。。
--
FROM 123.120.160.*
14楼
|
beep
|
2021-12-06 23:51:56
|
展开
之前业务是python写的,要加速,尝试了一阵子c++,受不了了,所以才转rust。。。
哪怕rust里用Rc+RefCell很多,也比c++强吧?
【 在 Bernstein (Berns) 的大作中提到: 】
: 你要用第二种风格的话,何必迁往rust呢,c++完美匹配你的要求
--
FROM 123.120.160.*
24楼
|
beep
|
2021-12-07 20:53:01
|
展开
我们在做的东西有点特殊,eda相关的,之前只是用py做了个原型验证了idea,现在就是要把性能瓶颈部分改写成c或者rust,但是性能瓶颈部分的数据结构也很复杂。
然后用py来调用rust的模块,和调用c的模块是很类似的
【 在 Bernstein (Berns) 的大作中提到: 】
: 其实建议你profile一下性能,然后把瓶颈用c改写成python模块...
--
FROM 123.120.160.*
25楼
|
beep
|
2021-12-07 20:55:42
|
展开
有意义啊
即使多用Rc+RefCell,一方面,和py比,还是要快很多很多的,另一方面,和c++比,好歹RefCell也提供了运行时的内存安全,读写指针冲突的时候会给你panic
【 在 eGust (十年) 的大作中提到: 】
: 这用法就好比把 js 迁移到 ts,然后所有类型都声明成 any,有啥意义呢?
--
FROM 123.120.160.*
26楼
|
beep
|
2021-12-07 20:57:30
|
展开
我这个场景性能还是很重要的,之前选型就是只在c/c++/rust里面选,后来也有人说,滥用Rc+RefCell的话,性能会接近go和swift,写起来还简单一些。但是也没有一个benchmark说到底和go的性能差别有多大。
具体到堆和栈的问题,我提到的那部分使用Rc+RefCell的数据结构本来就应该进堆的,用啥语言也一样
【 在 littleSram (littleSram) 的大作中提到: 】
: 为啥不用go呢
: 你都说了,直接放堆里
: go好歹还会做一下逃逸分析,大部分放在栈上
: ...................
--
FROM 123.120.160.*
28楼
|
beep
|
2021-12-07 21:10:40
|
展开
shared_ptr 就是 rust 的 Rc
【 在 xieyf (绿蚁新醅酒,红泥小火炉) 的大作中提到: 】
: 看了这些神叨叨的概念还不如用c++,至少shared_ptr保你平安。
--
FROM 123.120.160.*
下页
|
尾页
|
1/3
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版