Rust共享内存性能:快速增加索引[已关闭]

quhf5bfb  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(116)

已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

5天前关闭。
Improve this question
在Rust中,使用共享内存最快的结构是什么?
作为共享内存的一个例子,假设有一个长度为N的Vec,并且在vec (start, end): (usize, usize)上有一个传入切片流。在每个切片中,您希望递增切片中的每个索引。

t2a7ltrp

t2a7ltrp1#

如果我们假设如下:

  • 数据应该是u8
  • 多个线程需要高度并发地访问数据
  • 他们不需要同时对多个元素进行原子访问

那么我个人会选择&[AtomicU8]Arc<[AtomicU8]>,在所有可能的情况下我更喜欢&[AtomicU8];只有当你的记忆是短暂的时候才需要Arc

use std::sync::atomic::{AtomicU8, Ordering};

fn thread_func(data: &[AtomicU8], mutations: impl IntoIterator<Item = (usize, usize)>) {
    for (start, end) in mutations.into_iter() {
        for value in &data[start..=end] {
            value.fetch_add(1, Ordering::Relaxed);
        }
    }
}

fn main() {
    let data: [AtomicU8; 10] = Default::default();

    println!("data: {:?}", data);

    std::thread::scope(|s| {
        s.spawn(|| thread_func(&data, [(0, 5), (2, 6), (0, 9)]));
        s.spawn(|| thread_func(&data, [(1, 4), (3, 5), (7, 8)]));
    });

    println!("data: {:?}", data);
}

个字符
请注意,如果你真的想要 “最快的构造”,那么不要简单地相信我的话。尝试多种事物并进行基准测试。
例如,如果你的切片很大,而线程冲突很小,那么使用Mutex<[u8]>可能会更快。这意味着线程碰撞会慢很多,但每个切片的实际迭代会快很多。原子没有太多开销,但也不是零。

相关问题