我需要存储十亿个“外观”,我正在寻找最有效的方式来存储这些内存使用和性能。例如,a1, a2, a3
在这些方面的差异是什么:
struct Appearance<'a> {
identity: &'a u64,
role: &'a str
}
struct AnotherAppearance<'a>((&'a u64, &'a str));
fn main() {
let thing = 42;
let hair_color = "hair color";
let a1 = Appearance {identity: &thing, role: &hair_color};
let a2 = AnotherAppearance((&thing, &hair_color));
let a3 = (&thing, &hair_color);
}
有没有更好的方法来处理这样的结构?另外,有没有办法获取有关a1, a2, a3
的详细信息,以便我可以看到它们在内存中的表现方式?
答案 0 :(得分:6)
首先,正如Ijedrz指出的那样,你提出的所有替代品都有相同的尺寸。事实上,从编译器的角度来看,他们都是相同的。
如果您在较小的内存大小之后,最好使用以下内容:
struct Appearance {
identity: u32,
role: InternedString,
}
首先,u32
有40亿个不同的值,因此您绝对不需要{10}记录的u64
。除此之外,&u64
将与64位计算机上的u64
大小相同,因此使用它的意义不大。 u32
是一半的奖金。
除此之外,&str
似乎非常浪费。对于数据,我将采取两个指针,我认为这些指标不太可能发生太大变化。如果有多个Appearance
s而不是角色,那么最好的办法是实习字符串并将字段缩减为指针(甚至更好:通过另一个表间的u32
ID。标准库中没有固定字符串,但它们并不难实现,假设您无法在某处找到它。这样的结构(假设InternedString
是u32
ID)将是8个字节而不是24个字节。
如果性能与您相关,那取决于您使用这些结构 的方式。也就是说,&u64
比u64
慢,所以改变它可能会有所帮助。至于字符串,它取决于你如何使用它。如果您主要进行比较,则实习字符串会更快,因为您可以将那些与单个比较进行比较;比较常规字符串可能会慢很多,因为你必须实际查看内容。
答案 1 :(得分:4)
所有三种变体似乎都具有相同的大小:
use std::mem::size_of;
println!("a1: {}", size_of::<Appearance>()); // a1: 24
println!("a2: {}", size_of::<AnotherAppearance>()); // a2: 24
println!("a3: {}", size_of::<(&u64, &str)>()); // a3: 24
所以我只想使用最具描述性的那个,即Appearance
。