RubyとJavaの文字列の扱いの違い

Javaで文字列(String)はimmutable(改変不可)なオブジェクトであるの
に対してRubyでの文字列はmutable(改変可能)なオブジェクト。


Javaではimmutable(改変不可)なオブジェクトであることから、メソッド
内に埋め込まれた文字列をコンパイラ側でプライベートStatic変数と
同等の扱いとなるように変換(最適化)したバイトコードを生成している。


Rubyではこのような最適化は現時点では行われていない、Rubyでは
Stringはmutable(改変可能)なオブジェクトなので同様の最適化を行う
のは難しい(あるいは最適化処理のロジックが複雑になる)と思われる。
例え行えたとしてもこのような最適化によるオーバーヘッドは無視で
きない、最適化に要する処理時間と最適化により生じた実行フェーズで
の短縮時間との間で相殺されればこのような最適化を行う意味はない。


クラスをインスタンス化する際にはメモリ確保等によるオーバーヘッド
があり、埋め込まれた文字列は実行時にインスタンス化されるため、
埋め込み文字列によるパフォーマンスへの影響は無視できない。


Rubyでは前述したような(コンパイラによる)最適化は現時点では
行われていないので不変な文字列を直接メソッド内に埋め込む
ことは避けるべき。
不変な文字列はメソッド内に埋め込むのではなく、static変数と
して切り出して、メソッド内からその変数にアクセスするのが
望ましい。


但し、文字列の式展開を利用している場合はstatic変数として切り出せない、
文字列の式展開は処理速度への影響が最小限となるように利用するのが望ましい。