2017-07-03 7 views
0

10億の「外観」を保存する必要があります。メモリ使用量とパフォーマンスの両方に関してこれらを格納する最も効率的な方法を探しています。最低限のメモリ使用量と最高のパフォーマンス

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ため、これらの点で、例えば、違いは何ですか?また、a1, a2, a3に関する詳細情報を取得する方法がありますので、それらが自分のためにメモリにどのように表現されているかを確認できますか?

答えて

6

最初に、Ijedrzが指摘したように、提案されたすべての代替案は同じサイズです。実際、コンパイラの観点からは、それらはすべてと同じです。です。

あなたが小さいメモリサイズ後にしている場合は、オフのようなもの使用して良いかもしれない:あなたは間違いなくu64用を必要としないので、すべての

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

まず、u32は40億の異なる値を持っているが10億レコードそれとは別に、&u64は、64ビットマシンのu64と同じサイズになるので、それを使うのはあまり意味がありません。 u32が半分の大きさのボーナスです。

これを超えると、は非常に無駄になります。それは、私が想定しているように、あまり変わることのないデータのための2つの指針を取ることになります。ロールよりも多くのAppearanceがある場合は、文字列をインテンシブしてフィールドをポインタに減らすことが最善の方法です(または、別のテーブルで間接的に使用されるu32 ID)。標準ライブラリには文字列がありませんが、実装するのは難しいことではありません。そのような構造体(InternedStringu32 IDであると仮定した場合)は、24バイトに対して8バイトになります。

パフォーマンスがあなたの後であれば、それはの方法に従います。あなたは構造を使用します。つまり、&u64u64よりも遅いので、おそらくそれを変更すると役に立ちます。文字列は、使用方法によって異なります。ほとんどの場合比較を行うと、とそれらのを比較することができるため、中身の文字列はより速くなります。あなたが実際に内容を見なければならないので、通常の文字列を比較することはずっと遅くなる可能性があります。

+0

ブリリアントではないので、私はロールのルックアップキーとしてu16を使用することもできます。理論的には、u64は "Keeper of Identities"に所有されていて、コード内でこの動作が反映されると思いました。私は、Appearanceが独自のu64を所有している場合、Keeperが認識していないインスタンスが作成された場合、コンパイラは不平を言うことはないとのトレードオフがあると思いますか?あなたが&u64のために「遅い」と言うと、どれくらい遅く話していますか? –

+0

@LarsRönnbäck:私はどれほど遅いのかは分かりませんが、値を調べたり使用したりするためには、デフレクションを実行してメモリ内の他の場所を見る必要があります。物事をローカルに保つことは、キャッシュ・スラッシングを減らすことを意味します。ほぼすべてのperf関連の質問と同様に、それはあなたの特定の状況に依存します。 –

4

すべての3つの変異体は、同じ大きさを持っているように見える:

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を最も記述的であるものを使用します。

関連する問題