ループ内に10,000個の文字列を作成すると、多くのリソースを消費するガベージコレクションが頻繁に行われます。Rubyのシンボルはガベージコレクションされていません!それでは、文字列を使う方が良いのではないでしょうか?
シンボルで同じことを行う場合は、cannot be garbage collectedというオブジェクトを作成します。
どれが悪いですか?
ループ内に10,000個の文字列を作成すると、多くのリソースを消費するガベージコレクションが頻繁に行われます。Rubyのシンボルはガベージコレクションされていません!それでは、文字列を使う方が良いのではないでしょうか?
シンボルで同じことを行う場合は、cannot be garbage collectedというオブジェクトを作成します。
どれが悪いですか?
ほとんどの場合、リテラルを使用してシンボルとして表示されますが、ここではメモリ爆発の可能性はあまりありません。彼らの行動は、その使用法によってかなり必要とされます:あなたがシンボルを参照するたびに、それは同じものです。
同様に、文字列はRubyでは一意である必要があります。これは、使用されている方法(テキスト処理など)のためです。
セマンティクスによって使用するものを決めます。早めに最適化しないでください。
あなたの代わりにそこに文字列を使用する場合は、あなたのループ内で同じシンボルを参照する場合、それは今
while i < 10000
i += 1
:im_using_this_symbol_here
end
すなわち、そのオブジェクトのたびを再作成する必要はありません、文字列は10K回に再作成されます。一般的に、定数やキーのようにリテラルをほとんど扱う場合には、シンボルを使用します。私にとって非常に良い例は
link_to "News", "action" => 'news'
アクションがアプリケーション内で何度も再使用されて
link_to "News", :action => 'news'
代わりとなるであろう。
Ruby 2.2.0以降を使用している場合は、more details about the new symbol GCへのリンクを持つRuby 2.2.0-preview1 announcementに従ってガーベジコレクションされるため、多くのシンボルを動的に作成するのが通常はOKです。しかし、ダイナミックシンボルをID(Cソースコードで使用されている内部Ruby実装のコンセプト)に変換するコードに渡すと、その場合は固定され、ガベージコレクションは行われません。私はどのくらい一般的にそれが起こるかわからない。
あなたが考慮すべき記号や文字列を使用するかどうかを決定する:それらが作成された後
私は経験則を追加することができます。ユーザーが指定した文字列をSymbolsに変換することはありません。それはDOS攻撃の可能性を開くでしょう。 – Arsen7