小编Mig*_*uel的帖子

在更新到Rust 1.38.0后,为什么Vec :: retain运行速度较慢?

将Rust从1.36.0更新到1.38.0后,我注意到我的程序运行速度较慢–降低了约50%。

使用perf,我发现alloc::vec::Vec<T>::retain新版本花费了一半的程序时间。在旧版本中,此功能甚至不会显示。为什么retain在1.38.0中需要花费更长的时间?

呼叫retain是这样完成的:

some_vec.retain(|&x| x < DEADLINE);
Run Code Online (Sandbox Code Playgroud)

deadline是一个常数u32some_vec是一个Vec<u32>

retain在两个版本中都没有调用的情况下运行了该程序。在这种情况下,平均1.38.0仍然较慢,但仅降低了〜10%,而不是之前看到的> 50%。

回顾一下测试中发生的情况:

版本1.36.0

  • retain:〜18秒
  • 没有retain:〜11秒

版本1.38.0

  • retain:〜28秒
  • 没有retain:〜12秒

对于可重现的示例,您可以尝试:

use std::time::Instant;

fn main() {
    let start = Instant::now();
    let mut my_vec: Vec<u32>;
    for _ in 0..100_000 {
        my_vec = (0..10_000).collect();
        my_vec.retain(|&x| x < 9000);
        my_vec.retain(|&x| x < 8000);
        my_vec.retain(|&x| x < 7000);
        my_vec.retain(|&x| x < 6000); …
Run Code Online (Sandbox Code Playgroud)

performance rust

8
推荐指数
1
解决办法
239
查看次数

使用排列器箱中的迭代器推入向量时,为什么会收到“expected u32,found &amp;{integer}”?

我想创建一个函数,返回一个数据结构,其中包含特定一组数字的所有可能组合:例如: for [1, 2, 3]return [[1], [2], [3], [1, 2], [2,1], ..., [1, 2, 3], [2, 1, 3], ...[3, 2, 1]]

我理解 和cp的某种向量&integer,但我找不到将它们保存到数组或向量中的方法。我试图将其保存为向量的向量,因为我认为不可能将它们保存为数组的向量,因为数组具有不同的大小。它也不可能作为向量数组,因为我不知道开始时的组合数量。

如何将所有c和存储p在数据结构中,以便可以在外部返回和使用?

use permutator::{Combination, Permutation}; // 0.3.3

pub fn init() -> Vec<Vec<u32>> {
    let actions: Vec<Vec<u32>>;
    let mut data = &[1, 2, 3];
    let mut counter = 1;
    for i in 1..=data.len() {
        data.combination(i).for_each(|mut c| {
            println!("{:?}", c);
            actions.push(c);
            c.permutation().for_each(|p| {
                println!("k-perm@{} = {:?}", counter, p); …
Run Code Online (Sandbox Code Playgroud)

types vector slice rust

4
推荐指数
1
解决办法
4447
查看次数

如何使用 Rust 对树结构中的单个节点进行多个引用

尝试使用以下结构创建一棵 Rust 树:

pub struct Node{
    pub children: Vec<Box<Node>>,
    pub parent: Option<Box<Node>>,
    pub value: f32,
    //.....
}
Run Code Online (Sandbox Code Playgroud)

要构建新节点,请使用以下函数:

pub fn build_node(parent: Option<Box<Node>>)-> Node{
    Node{
        children: vec![],
        parent,
        value: 0.0,

    }
}
Run Code Online (Sandbox Code Playgroud)

尝试添加节点时,例如:

let mut root_nd = tree::build_node(None, 5, state);
let mut next_nd = tree::build_node(Some(Box::new(root_nd)), 2);
root_nd.children.push(Box::new(next_nd));
Run Code Online (Sandbox Code Playgroud)

会有错误,因为我正在借用root_nd,然后尝试添加next_ndroot.children列表中,即使没有这个错误,我仍然需要next_nd在将其添加到 的子级后有一个参考root_nd。我知道在 Rust 中,同一个元素不可能同时拥有多个可变引用。所以问题是如何在 Rust 中创建一个具有双向引用的树状数据结构?在我看来,这是一个冲突,因为 Rust 不需要多个引用,但我需要树中间的一个节点被他的父节点和子节点引用。

tree reference rust

4
推荐指数
1
解决办法
1782
查看次数

如何从元素向量创建随机样本?

我使用此代码为数字 0 到 49 创建了一个随机样本。现在我想为一组自定义值创建一个随机样本。例如:从 中选择 5 个样本[1, 2, 3, 4, 9, 10, 11, 14, 16, 22, 32, 45]。我怎样才能做到这一点?

use rand::{seq, thread_rng}; // 0.7.3

fn main() {
    let mut rng = thread_rng();
    let sample = seq::index::sample(&mut rng, 50, 5);
}
Run Code Online (Sandbox Code Playgroud)

sample rust

3
推荐指数
2
解决办法
1264
查看次数

标签 统计

rust ×4

performance ×1

reference ×1

sample ×1

slice ×1

tree ×1

types ×1

vector ×1