https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112013-11-05T17:03:13ZRuby Issue Tracking SystemRuby master - Bug #9080: ENV[key] produces three objectshttps://bugs.ruby-lang.org/issues/9080?journal_id=427522013-11-05T17:03:13ZEregon (Benoit Daloze)
<ul></ul><p>A little <code>ObjectSpace</code> exploration gives:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">n</span> <span class="o">=</span> <span class="mi">1</span>
<span class="no">GC</span><span class="p">.</span><span class="nf">disable</span>
<span class="n">a</span> <span class="o">=</span> <span class="no">ObjectSpace</span><span class="p">.</span><span class="nf">count_objects</span><span class="p">[</span><span class="ss">:T_STRING</span><span class="p">]</span>
<span class="n">strings</span> <span class="o">=</span> <span class="p">{}</span>
<span class="no">ObjectSpace</span><span class="p">.</span><span class="nf">each_object</span><span class="p">(</span><span class="no">String</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">s</span><span class="o">|</span> <span class="n">strings</span><span class="p">[</span><span class="n">s</span><span class="p">.</span><span class="nf">object_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span> <span class="p">}</span>
<span class="n">n</span><span class="p">.</span><span class="nf">times</span> <span class="p">{</span> <span class="no">ENV</span><span class="p">[</span><span class="s2">"HOME"</span><span class="p">]</span> <span class="p">}</span>
<span class="n">b</span> <span class="o">=</span> <span class="no">ObjectSpace</span><span class="p">.</span><span class="nf">count_objects</span><span class="p">[</span><span class="ss">:T_STRING</span><span class="p">]</span>
<span class="nb">p</span> <span class="n">a</span> <span class="o">=></span> <span class="n">b</span>
<span class="nb">p</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="n">n</span><span class="p">.</span><span class="nf">to_f</span>
<span class="n">new_strings</span> <span class="o">=</span> <span class="no">ObjectSpace</span><span class="p">.</span><span class="nf">each_object</span><span class="p">(</span><span class="no">String</span><span class="p">).</span><span class="nf">reject</span> <span class="p">{</span><span class="o">|</span><span class="n">s</span><span class="o">|</span> <span class="n">strings</span><span class="p">.</span><span class="nf">key?</span> <span class="n">s</span><span class="p">.</span><span class="nf">object_id</span> <span class="p">}</span>
<span class="nb">p</span> <span class="n">new_strings</span>
<span class="nb">p</span> <span class="n">new_strings</span><span class="p">.</span><span class="nf">size</span>
</code></pre>
<p><code>ObjectSpace.count_objects</code> seems unreliable in this case, sometimes the number of <code>T_STRING</code> is less after invocations of <code>ENV["HOME"]</code> yet the GC is supposed to be disabled.</p>
<p>The difference using <code>ObjectSpace.each_object</code> give us the 3 String:</p>
<pre><code>["/home/me", "UTF-8", "HOME"]
</code></pre>
<p>I am a bit concerned about the <code>"UTF-8"</code> String created.<br>
<code>"HOME"</code> is created each time, and could be avoided by assigning it to a variable.<br>
After all, the compiler is not supposed to know <code>ENV[]</code> is not modifying its argument,<br>
and there is no clue the <code>String</code> should be immutable.<br>
(detection of literal <code>.freeze</code> should help, but will anyone do <code>ENV["HOME".freeze]</code> ?<br>
Anyway real code would likely not invoke <code>ENV[var]</code> many times for the same var)</p> Ruby master - Bug #9080: ENV[key] produces three objectshttps://bugs.ruby-lang.org/issues/9080?journal_id=539422015-08-21T23:42:55Zko1 (Koichi Sasada)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>Please reopen if you feel it is worth to fix.</p>