小编Jam*_*Jam的帖子

将字节打包到 u32 与将它们存储在 vec<u8> 中的性能差异?

介绍:

我很好奇将小数存储为位打包无符号整数与字节向量的性能差异(cpu 和内存使用量)

例子

我将使用存储 RGBA 值的示例。它们是 4 个字节,因此很容易将它们存储为u32.
但是,将它们存储为类型的向量会更具可读性u8


作为一个更详细的例子,假设我想存储和检索颜色 rgba(255,0,0,255)

这就是我将如何去做这两种方法:

// Bitpacked:
let i: u32 = 4278190335;
//binary is 11111111 00000000 00000000 11111111
//In reality I would most likely do something more similar to:
let i: u32 = 255 << 24 + 255; //i think this syntax is right

// Vector:
let v: Vec<u8> = [255,0,0,255];
Run Code Online (Sandbox Code Playgroud)

然后可以查询这两个红色值

i >> 24 
//or
&v[0]
//both expressions evaluate to 255 (i think. I'm really new to …
Run Code Online (Sandbox Code Playgroud)

bit-packing rust

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

幕后的参考/借用到底是什么?又名堆栈指针与堆指针

我从概念上理解借用;它们是不被拥有的价值,必须通过借款人丢弃来归还给所有者

这是有道理的,但我实际上不明白参考什么。我读到 Rust 引用不执行堆分配,但它们实际上也是指针。

如此之多以至于以下代码可以直接将引用转换为原始堆分配的指针:

// owned value
let some_val = 1;

// reference
let some_ref = &some_val;

// pointer
let some_ptr = some_ref as *const i32;

// prints "1 1 1" as expected
unsafe {
    println!("{} {} {}", some_val, some_ref, *some_ptr);
}

Run Code Online (Sandbox Code Playgroud)

我的理解哪一部分是错误的?我的假设是指针后面和堆栈分配是互斥的,但我错了吗?告诉我引用不是堆分配的消息来源是错误的吗?

我想第二个问题是问上面的片段中的内存到底是什么样的^

据我的理解,情况如下:

// load const 1 and store as some_val
let mut some_val = 1;

// load 1 onto the stack and invoke do_something
do_something(some_val);

// still load 1 onto the stack and invoke …
Run Code Online (Sandbox Code Playgroud)

pointers rust

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

在同步代码中使用 async/await 是否有任何性能优势?

我试图了解何时使用异步以及何时可以提高性能。

\n

我知道它 \xe2\x80\x99s 在替换其他阻塞 IO 操作(如文件 IO、http 调用、数据库操作等)方面最强大,但我想知道除此之外是否有 \xe2\x80\x99s 任何点(在至少就性能而言)。

\n

一个具体的例子可能是大内存副本(移动大向量或以其他方式复制大量数据)。这是一个同步操作,就程序的其余部分而言可能需要一段时间。这个示例是否可以利用 async/await 在等待副本时执行其他操作,或者线程必须等待内存副本才能继续执行?

\n

如果不是这个直接的例子,也许另一个可以通过 async/await 改进的同步操作?

\n

rust async-await rust-async-std

0
推荐指数
1
解决办法
914
查看次数