最少的内存使用和最佳性能

时间:2017-07-03 13:49:51

标签: rust

我需要存储十亿个“外观”,我正在寻找最有效的方式来存储这些内存使用和性能。例如,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的详细信息,以便我可以看到它们在内存中的表现方式?

2 个答案:

答案 0 :(得分:6)

首先,正如Ijedrz指出的那样,你提出的所有替代品都有相同的尺寸。事实上,从编译器的角度来看,他们都是相同的

如果您在较小的内存大小之后,最好使用以下内容:

struct Appearance {
    identity: u32,
    role: InternedString,
}

首先,u32有40亿个不同的值,因此您绝对不需要{10}记录的u64。除此之外,&u64将与64位计算机上的u64大小相同,因此使用它的意义不大。 u32是一半的奖金。

除此之外,&str似乎非常浪费。对于数据,我将采取两个指针,我认为这些指标不太可能发生太大变化。如果有多个Appearance s而不是角色,那么最好的办法是实习字符串并将字段缩减为指针(甚至更好:通过另一个表间的u32 ID。标准库中没有固定字符串,但它们并不难实现,假设您无法在某处找到它。这样的结构(假设InternedStringu32 ID)将是8个字节而不是24个字节。

如果性能与您相关,那取决于您使用这些结构 的方式。也就是说,&u64u64慢,所以改变它可能会有所帮助。至于字符串,它取决于你如何使用它。如果您主要进行比较,则实习字符串会更快,因为您可以将那些与单个比较进行比较;比较常规字符串可能会慢很多,因为你必须实际查看内容。

答案 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