Rust 结构体字段作为 arc 与结构体作为 arc

Cro*_*n3x 1 performance multithreading rust automatic-ref-counting

我有一个关于 Rust 中的 Arc 的问题。我想做一些多线程的事情,并偶然发现了 Arcs,可以让多个线程访问相同的数据。目前,我使用字段为 Arcs 的结构,并且该结构只是正常的。我使用该结构作为某种配置,并将需要它的函数克隆到所需的字段。我的问题是,将结构变量设置为弧形并将字段设置为正常值比将其传递给函数并检索所需字段更好吗?我对内存使用和速度差异非常感兴趣;有没有,或者只是为了方便使用其中之一?

我想到的代码:

struct Config{
   name: String,
   id:   u32,
   ...
}

let myconf = Arc::new(Config::default());

do_stuff(myconf.clone()).await;
...
Run Code Online (Sandbox Code Playgroud)

当前代码:

struct Config{
   name: Arc<String>,
   id:   Arc<u32>,
   ...
}

let myconf = Config::default();
do_stuff(myconf.name.clone(), myconf.id.clone()).await;
...
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 7

如果所有字段都是Arc,通常最好将整个结构放在 an 后面,Arc而不是Arc每个字段只包含许多 s 。

这样,克隆和删除更便宜(只有一个引用计数碰撞而不是许多),移动结构更便宜(只有一个指针而不是许多),结构创建更快(一次分配而不是许多),使用更少的内存(因为每个都Arc需要两个额外的字来进行引用计数),并且缓存局部性更好(因为数据是连续分配的而不是分散在许多中),并且指针追逐也更少。

Arc如果您想隐藏在接口中使用an 的事实,您可以有两个结构体, Configand ConfigInner,而 letConfig只是 的包装器Arc<ConfigInner>