2

MySQL データベースのいくつかのレコードを表すハッシュを作成しています。ハッシュ キーはデータベース ID フィールドに対応し、ハッシュ値はデータベース名フィールドに対応します。

何が良いのか、その理由は?

  1. 配列

    これは機能しますが、すべての中間インデックス tp の値を設定する余分なオーバーヘッドがあるように見えるため、Ruby は疎な配列では効率が悪いようですnil

    fruits = []
    fruits[23] = "apple"
    fruits[109] = "orange"
    # ...
    fruits[23429] = "banana"
    
  2. fixnum をキーとするハッシュ

    私はこれが一番好きですが、シンボルをハッシュのキーとして使用するのが最善であるといつも読んでいます。ハッシュのキーとして fixnums を使用するのと同じくらい良いですか? かどうかはわかりませんが34.hash、fixnums の性質上、つまり、34.equal? 34真であるのに対して"hi".equal? "hi"偽であると考えられます。

    fruits = {
      23 => "apple",
      109 => "orange",
      # ...
      23429 => "banana"
    }
    
  3. キーとして fixnums のインターンされた文字列表現を持つハッシュ

    fixnum を文字列に変換してから記号に変換することで、記号をキーとして使用できます。ただし、この変換は煩わしく、文字列のインターンは効率が悪いと誰かが言ったことがあります。そうですか?彼らは私には醜く見えるだけです。

    fruits = {
      :"23" => "apple",
      :"109" => "orange",
      # ...
      :"23429" => "banana"
    }
    
  4. シンボルをキーとするハッシュ

    各キーの前にアルファ文字を付けることで、よりきれいなシンボルを取得できます (また、新しい Ruby 1.9 ハッシュ構文も使用できます) が、このソリューションでは変換も必要になります。

    fruits = {
      i23: "apple",
      i109: "orange",
      # ...
      i23429: "banana"
    }
    
4

2 に答える 2

5

私の提案: キーで a を使用HashFixnumます。

あなたが言うように、これはスパースオブジェクトを許可します。sに適用される特別な速度とメモリの最適化がありますFixnum。それらは期待どおりに比較され、すべてに変換されます。これは、シンボルよりも高速で単純である必要があり、通常は解析できなかった文字列をインターンするという奇妙さはありません。

于 2011-03-30T17:21:36.933 に答える
2

私の知る限り、それsymbol.hashは定数であるためhash、シンボルの呼び出しは単純なプロパティ検索であり、非常に高速です。シンボルは、この特定の用途に最適化されています。文字列のハッシュ値を計算する必要があるため、文字列の呼び出しhashには実際の作業が必要であり、文字列はハッシュ値をキャッシュしているようには見えません。Fixnumのhash値は、Fixnum の内部オブジェクト ID (定数) のいくつかの単純なビット マングリングで計算されるように見えるため、高速である必要があります。これを権威あるものと見なさないでください。私は 1.9.2 のソースを簡単に確認しただけですが、Ruby の内部構造についてはほとんど専門家ではありません。

そうは言っても、ハッシュキーとして Fixnums を使用します。これにより、メモリの点でも効率的なスパース配列の自然な表現が得られます。速度の違いは、おそらく無関係なノイズになります。したがって、最も明確なアプローチを採用し、実際に速度の問題がある場合は最適化について心配してください。

于 2011-03-30T18:06:29.677 に答える