note
diotalevi
<p>An update ... though stuff like '=' assignments make this entirely less than obvious. Check these stats out.</p><code>use Devel::Size 'total_size';
$ARY[ $_ ] = ? for 1 .. 1_000_000;
print total_size( \ @ARY ) . "\n";
# Do this as a comparison of a sparse array
$ARY_B[ 1_000_000 ] = 1;
print total_size( \ @ARY_B );</code>
<table>
<tr><th>Code</th><th>Size</th></tr>
<tr><td>sparse</td><td>4,000,072</td></tr>
<tr><td>undef</td><td>16,194,340</td></tr>
<tr><td>1</td><td>20,195,340</td></tr>
<tr><td>\ undef</td><td>20,194,352</td></tr>
<tr><td>\ !1</td><td>20,194,377</td></tr>
<tr><td>\ !!1</td><td>20,194,378</td></tr>
<tr><td>\ 1</td><td>20,195,340</td></tr>
<tr><td>( 1 + $| )</td><td>24,194,340</td></tr>
<tr><td>\ ( 1 + $| )</td><td>40,194,340</td></tr>
<tr><td>!1</td><td>41,194,340</td></tr>
<tr><td>!!1</td><td>42,194,340</td></tr>
</table><hr /><p>I use <code>!! $x</code> because the return value is one of the values PL_sv_yes or PL_sv_no both of which are a single scalar that is shared through the entire process, forever. It is somewhat like undef being shared everywhere. You can have a million return values from !! $x and have them take up no space or you can have a million 1's and every one takes up a whole SV's worth of memory.</p><p>The choice is obvious.</p>
367515
367515