【问题标题】:Performance of Rust vector (`Vec<T>`) versus array (`[T; n]`) [closed]Rust 向量(`Vec<T>`)与数组(`[T; n]`)的性能[关闭]
【发布时间】:2020-06-20 08:14:20
【问题描述】:

在 Rust 中使用向量与数组相比,我在性能方面损失了多少?

我所说的性能是指:元素访问速度或迭代速度。

【问题讨论】:

    标签: arrays vector rust


    【解决方案1】:

    它们都将数据存储在线性连续数组中,其中访问或迭代都是 O(1) 操作,因此性能没有差异。向量较慢的唯一情况可能是一些小列表,因为数组存储在当前堆栈帧的堆栈中,因此它们的数据很可能已经加载到 CPU 缓存中。 Vector OTOH 将数据存储在堆上,因此数据在首次访问之前不会在缓存中可用

    Vector 还多了一层重定向,因为你需要先加载数组的地址,所以第一次内存访问也可能比较慢,但这可以忽略不计

    另一个向量更糟糕的时候是当你使用向量的向量而不是多维数组时,因为每个向量都是单独分配的,并且位于不利于缓存的内存周围。见Access time of vec vs array

    另见Difference between array vs. vec for memory and cpu usage

    【讨论】:

    • 由于堆栈保护,堆栈上的数组速度较慢。是的,这是违反直觉的。唯一的 vec 问题是分配时间,如果你编码正确,这不是问题,也不是这个问题的范围。
    • @Stargateur Rust 通常会为堆栈变量编译带有特定缓冲区溢出保护的代码吗?我怀疑这是真的。 Rust 中的安全代码默认是内存安全的,并且无论您要索引的数组是在堆栈上还是在堆上,都会检查所有索引访问。
    • @SvenMarnach 语言无关很多 Rust 代码依赖于可能会破坏堆栈的外部库,但是是 rust 有这个选项(llvm),添加可能的操作系统保护。几乎没有理由使用数组而不是向量,在现实世界中,应用程序堆栈会更慢、更危险、更不灵活。堆栈应该只用于小数组,而不是缓冲区。
    • @Stargateur 我们似乎在谈论不同的事情。我指的是软件堆栈保护à la -fstack-protector-all,它会发出额外的代码来检测缓冲区溢出,据我所知,它与操作系统无关。这种保护在 Rust 中没有太大意义,因为它对我们链接的任何 C 库都没有帮助,并且与 Rust 的标准内存安全特性相比没有任何额外的好处。您似乎指的是我不知道的不同“堆栈保护”。
    • 嵌套 vecs 与一维数组并不总是涉及性能差异。我对此感到惊讶!我写了一个光线追踪器来存储 2D 像素网格。基准测试显示将 2D 网格存储在一维数组和 vec-inside-vec 之间的差异为零。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多