2017-06-20 8 views
0

こんにちは、いくつかの練習をしながら、私はこの質問に出くわしました...
あなたは100,000の容量を持つ地図を持っていると言います。
最低限の時間で地図全体を埋めるのに最も効率的なのはどれですか?私は私が考えることができタイプと結果のトップリストのほとんどを試して自分自身にいくつかのベンチマークを実行したしました最も効率的なゼロ値はどれですか?


です:

Benchmark_Struct-8   200   6010422 ns/op (struct{}{}) 
Benchmark_Byte-8    200   6167230 ns/op (byte = 0) 
Benchmark_Int-8    200   6112927 ns/op (int8 = 0) 
Benchmark_Bool-8    200   6117155 ns/op (bool = false) 

例機能:

func Struct() { 
    m := make(map[int]struct{}, 100000) 
    for i := 0; i < 100000; i++ { 
     m[i] = struct{}{} 
    } 
} 

最も速いものが表示されます(ほとんどの場合)は01型です- 空の構造体。

  • しかし、なぜこれが場合であるがに行きますか?
  • より速い/軽いゼロまたはゼロ以外の値がありますか?


は - お時間をいただき、ありがとうございます:)

+4

一度も使用されていないマップに空の値を多く追加するのにかかる時間は、一般的な使用例ではないと思います。基本的には、異なる種類のマップを展開するために使用されるマシンコードをテストするだけです。何か違いがあれば、全体的なメモリ使用量はほとんどのプログラムに関連します。私は個人的にbool値を持つのが好きなので、 '、ok'はキーの存在を確認する必要はありません。 – JimB

+0

これは有用ではあるが、その速度差がそれほど大きくないため、関連性がない状況があります。興味深いことに(boolについて)。ありがとう。 – Mihailo

答えて

4

を、それは何のメモリを必要としないため、理論的には、struct{}{}は、最も効率的でなければなりません。実際には、a)結果はGoバージョン、オペレーティングシステム、およびシステムアーキテクチャによって異なる場合があります。 b)空の値の実行時効率を最大限にすることが重要な場合は考えられません。

+0

私はそれがリアルライフアプリにとって最も関連性の高い質問ではないことに同意します。しかし、私はバイト= 0が最速であることを期待していたので面白かったです。時々、私はその言語を使いこなすのが好きです。あなたの建設的な答えをありがとうございます:) – Mihailo

+0

'byte = 0'は8ビットの記憶装置を必要とします' struct {} {} 'は0を必要とします8ビット×N個のオカレンスを管理することは一般に0ビット×Nオカレンスを管理するよりも効率が悪くなります。 – Flimzy

+1

@Flimzy:ハッシュマップは完全なバケットを望んでいないので(Goのconst load factorは6.5です)、バケットのオーバーヘッドは 'bool'(これはバケットに直接パックされています)と 'struct {}'と呼ばれます。メモリ使用量はわずか5〜6%の差があります(前回は数回前に数学をやったことがありましたが)、Nで 'struct {}'の値を使うと言うことはできませんmapは 'N'バイトを保存します。 – JimB

関連する問題