【 在 wolfgang (狂云) 的大作中提到: 】
: 标 题: Re: 请教个rust基本问题,Rc<RefCell<T>>有啥坏处?
: 发信站: 水木社区 (Wed Dec 15 12:51:05 2021), 站内
:
: 是啥类型的项目?可以稍微透露一下吗? :)
EDA方面的项目,典型场景是要构建一个层次化的几何体的树,在里面用各种算法去布局布线,也就是调整几何体的位置、增加用于连线的新几何体、检测矩形碰撞、连通性等等。典型规模大概在几百万个矩形这个量级上,或者更大。
:
:
: 我有这样一些不成熟的想法哈……
:
: 首先,既然为了压榨性能,不惜承受心智模型负担,那么,
: &的性能比Rc高,所以应该弃绝Rc。为了性能嘛。(当然我
: 个人不是压榨性能的爱好者,只不过Rc确实不适合用来压
: 榨性能。)
是的,这个主题开头几个帖子我也表达了对Rc性能的担心。而且用Rc<RefCell<T>>写了两周,已经出现了较难控制的循环引用内存泄漏问题。
现在倾向于使用slotmap这类的arena方案,就是用array index来代替指针/引用/Rc。性能损失也是会有的,因为毕竟中间多了一次根据下标做线性寻址的操作,slotmap这类方案为了避免ABA问题,还要额外储存version信息并且比对。直觉上这个和Rc+RefCell相比,性能损失应该差不多,谁多谁少说不准。但是避免了内存泄漏,心智模型也更简单。
slotmap arena方案有点像游戏开发里面的ECS,外面传来传去的只是一个entity id(下标),数据都在components里,行为都在system里。
:
: 其次,80%的CPU时间是用在20%的代码行数上的,这些代码是
: hot-part。这些hot部分应该特殊对待,不宜用Rc来让它们和
: 其它代码访问同样的数据。
:
: 再次,拆模块是性能之友,因为scalability是性能之友嘛。
: 把模块拆好,这样才好确定哪些模块可以复制部署到多台机
: 器上、使用更多的CPU核心数。
如果你之前说的拆模块只是指同一机器上、甚至同一进程里的功能对象封装的话,那当然是肯定要做的啦。
:
:
: 【 在 beep (菜M.喵星耗子) 的大作中提到: 】
: : 结构清晰心智模型简单,和压榨性能,有时候就是矛盾的。你说的这个方式,把共享的可变资源搞成独立模块甚至搞到数据库里面去,就会慢啊。在性能敏感的场景下,跑一个东西,也许就是10秒和十分钟的区别呢
:
:
: --
: 热二定律比动量守恒更高
: 它告诉我们世界的原初是恨
:
: 爱, 就是对恨的战斗!
:
:
: ※ 修改:·wolfgang 于 Dec 15 12:54:06 2021 修改本文·[FROM: 101.93.22.*]
: ※ 来源:·水木社区 mysmth.net·[FROM: 101.93.22.*]
--
修改:wolfgang FROM 101.93.22.*
FROM 123.120.160.*