# \[Bug #2447\] reduce GC pressure by symbol table without String instance

**URL:** <https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879>\
**Category:** Development\
**Created:** [December 6, 2009, 3:25pm UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879 "2009-12-06T15:25:29Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [December 6, 2009, 3:25pm UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879/1 "2009-12-06T15:25:29Z")

</div>

Bug #2447: reduce GC pressure by symbol table without String instance  
[http://redmine.ruby-lang.org/issues/show/2447](http://redmine.ruby-lang.org/issues/show/2447)

e$B5/I\<\<Te(B: Yusuke E.  
e$B%9%F!\<%?%9e(B: Open, e$BM%@hEYe(B: Normal  
e$BC4Ev\<Te(B: Koichi Sasada, e$B%+%F%4%je(B: core, Target version: 1.9.x  
ruby -v: ruby 1.9.2dev (2009-12-06 trunk 26025) [i686-linux]

e$B1sF#$G$9!#e(B

e$B8=:\_$N%7%s%%k%F!\<%V%k$O!“%7%s%%k$4$H$Ke(B String  
e$B$N%$%s%9%?%s%9$re(B  
e$B3d$jEv$F$F%7%s%%kL\>$r4IM}$7$^$9$,!”$=$N$;$$$Ge(B GC  
e$B$N8zN($,Mn$A$Fe(B  
e$B$$$k$H;W$$$^$9!#e(B

String e$B$G$O$J$/e(B ALLOC  
e$B$GD\>@\3NJ]$7$?NN0h$G4IM}$9$k%Q%C%A$r=q$-$^e(B  
e$B$7$?!#6KC\<$JNc$G$O$3$N$/$i$$Aa$/$J$j$^$9!#e(B

# e$B%Q%C%AA0e(B

$ time ./ruby.org -e ‘10000.times { GC.start }; p  
ObjectSpace.count\_objects[:T\_STRING]’  
1778

real 0m3.766s  
user 0m3.764s  
sys 0m0.004s

# e$B%Q%C%A8ee(B

$ time ./ruby.new -e ‘10000.times { GC.start }; p  
ObjectSpace.count\_objects[:T\_STRING]’  
433

real 0m2.880s  
user 0m2.876s  
sys 0m0.004s

benchmark e$B7k2L$O:G8e$K$“$j$^$9!#B?$/$N$b$N$O$[$\JQ$o$i$J$$$+B.$/e(B  
e$B$J$C$F$$$k$H;W$$$^$9!#e(B  
so\_meteor\_contest e$B$OM-0U$KB.EYDc2\<$7$^$9$,e(B (e$B:F8=@-$”$je(B)  
e$B!“M}M3$Oe(B  
e$B$h$/$o$+$j$^$;$s!#e(Bvm3\_thread\_mutex  
e$B$O\<B9T$9$kEY$K\<B9T;~4V$,Bg$-$/e(B  
e$BJQ$o$C$F$$$?e(B (3 e$BIC0J2\<$+$ie(B 30 e$BICD6e(B)  
e$B$N$G!”;29M$K$J$j$^$;$s$G$7$?!#e(B

e$B$I$J$?$+DI;n$7$F$/$@$5$k$H=u$+$j$^$9!#;d$N4D6-$Ge(B make test-all  
e$B$Oe(B  
e$BDL$C$F$$$^$9!#e(B

1.89s (2.57%): vm2\_eval 73.65-\>71.76  
1.88s (2.44%): so\_fannkuch 77.14-\>75.25  
1.86s (8.08%): so\_partial\_sums 23.04-\>21.18  
1.73s (7.20%): so\_mandelbrot 23.98-\>22.26  
1.43s (8.68%): so\_spectralnorm 16.43-\>15.00  
1.02s (6.19%): so\_nbody 16.49-\>15.47  
0.99s (1.13%): app\_pentomino 87.50-\>86.51  
0.82s (6.67%): vm1\_block 12.23-\>11.41  
0.76s (5.28%): so\_nsieve\_bits 14.37-\>13.61  
0.51s (15.68%): vm3\_gc 3.25-\>2.74  
0.34s (3.16%): so\_fasta 10.69-\>10.35  
0.23s (5.13%): so\_exception 4.52-\>4.29  
0.22s (3.01%): loop\_for 7.45-\>7.22  
0.19s (9.06%): app\_raise 2.10-\>1.91  
0.18s (4.67%): so\_object 3.88-\>3.70  
0.12s (1.77%): loop\_times 6.54-\>6.42  
0.11s (8.49%): so\_random 1.31-\>1.20  
0.09s (2.44%): app\_uri 3.88-\>3.78  
0.09s (1.07%): vm1\_simplereturn 8.35-\>8.26  
0.07s (4.13%): app\_strconcat 1.64-\>1.57  
0.06s (0.80%): vm2\_mutex 7.33-\>7.27  
0.06s (2.94%): app\_erb 1.95-\>1.89  
0.05s (0.59%): vm2\_method 8.94-\>8.89  
0.04s (1.04%): vm2\_array 3.63-\>3.59  
0.04s (0.97%): vm1\_rescue 3.80-\>3.76  
0.03s (0.56%): so\_nested\_loop 5.88-\>5.85  
0.03s (0.75%): loop\_generator 3.83-\>3.80  
0.03s (0.51%): so\_pidigits 5.38-\>5.35  
0.03s (2.87%): io\_file\_read 0.95-\>0.93  
0.03s (0.74%): vm2\_proc 3.51-\>3.48  
0.02s (0.65%): vm1\_ensure 3.82-\>3.79  
0.02s (1.45%): vm2\_poly\_method\_ov 1.64-\>1.61  
0.02s (0.74%): vm2\_zsuper 2.88-\>2.86  
0.02s (2.50%): app\_mandelbrot 0.83-\>0.80  
0.02s (0.46%): app\_tak 4.36-\>4.34  
0.02s (1.34%): vm2\_case 1.24-\>1.23  
0.01s (1.04%): io\_file\_create 1.18-\>1.17  
0.01s (0.43%): so\_matrix 2.11-\>2.10  
0.01s (0.18%): so\_ackermann 3.62-\>3.62  
0.01s (0.19%): app\_fib 3.21-\>3.21  
0.01s (1.47%): so\_sieve 0.41-\>0.40  
0.00s (0.06%): vm1\_ivar 6.23-\>6.22  
0.00s (0.03%): so\_concatenate 1.91-\>1.91  
0.00s (0.05%): app\_factorial 0.66-\>0.66  
0.00s (0.00%): vm1\_neq 6.22-\>6.22  
-0.00s (-0.03%): vm2\_send 2.02-\>2.02  
-0.00s (-0.41%): app\_answer 0.24-\>0.25  
-0.00s (-1.53%): so\_reverse\_complement 0.09-\>0.09  
-0.00s (-1.96%): so\_k\_nucleotide 0.07-\>0.07  
-0.00s (-0.38%): io\_file\_write 0.44-\>0.44  
-0.00s (-0.11%): loop\_whileloop 3.38-\>3.39  
-0.00s (-0.13%): app\_tarai 3.51-\>3.51  
-0.01s (-0.64%): so\_count\_words 1.09-\>1.10  
-0.01s (-0.68%): so\_lists 1.68-\>1.69  
-0.02s (-2.50%): loop\_whileloop2 0.67-\>0.68  
-0.02s (-1.04%): vm2\_unif1 1.76-\>1.78  
-0.02s (-1.12%): so\_binary\_trees 1.81-\>1.83  
-0.03s (-1.10%): vm2\_super 2.75-\>2.78  
-0.03s (-0.56%): vm1\_const 5.80-\>5.83  
-0.05s (-0.70%): vm2\_regexp 6.55-\>6.59  
-0.05s (-0.51%): vm3\_thread\_create\_join 10.49-\>10.55  
-0.06s (-1.18%): vm1\_swap 5.18-\>5.24  
-0.11s (-2.21%): vm1\_not 4.91-\>5.02  
-0.14s (-1.19%): vm2\_poly\_method 11.83-\>11.97  
-0.14s (-2.11%): vm1\_length 6.64-\>6.78  
-0.15s (-2.33%): vm1\_ivar\_set 6.57-\>6.72  
-0.18s (-2.42%): so\_array 7.40-\>7.58  
-0.31s (-2.23%): so\_nsieve 13.79-\>14.10  
-2.22s (-8.38%): so\_meteor\_contest 26.50-\>28.72  
-26.20s (-177.28%): vm3\_thread\_mutex 14.78-\>40.99

–  
Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [December 6, 2009, 11:14pm UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879/2 "2009-12-06T23:14:16Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39846] [Bug #2447] reduce GC pressure by  
symbol table without String instance”  
on Sun, 6 Dec 2009 23:24:59 +0900, Yusuke E.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|e$B8=:\_$N%7%s%%k%F!\<%V%k$O!“%7%s%%k$4$H$Ke(B String e$B$N%$%s%9%?%s%9$re(B  
|e$B3d$jEv$F$F%7%s%%kL\>$r4IM}$7$^$9$,!”$=$N$;$$$Ge(B GC e$B$N8zN($,Mn$A$Fe(B  
|e$B$$$k$H;W$$$^$9!#e(B  
|  
|String e$B$G$O$J$/e(B ALLOC e$B$GD\>@\3NJ]$7$?NN0h$G4IM}$9$k%Q%C%A$r=q$-$^e(B  
|e$B$7$?!#6KC\<$JNc$G$O$3$N$/$i$$Aa$/$J$j$^$9!#e(B

e$B3N$+$K!#\<B$Oe(BSymbole$B$re(BGCe$B$NBP\>]$H$7$h$&$H$9$kIz@~$G8=\>u$N$h$&$Ke(B  
e$B$J$C$F$$$k$N$G$9$,!";W$C$?$h$jFq$7$/$FJ|CV$7$F$^$9!#EvLL!"e(B  
Symbole$B$Ne(BGCe$B$O$G$-$=$&$K$J$$$s$@$+$i!“1sF#$5$s$N;XE&$N$h$&$K$9e(B  
e$B$Y$-$J$N$+$J$”!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [December 8, 2009, 10:37am UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879/3 "2009-12-08T10:37:42Z")

</div>

e$B%o%J%Y$H?=$7$^$9!#e(B

09/12/06 Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B8=:\_$N%7%s%%k%F!\<%V%k$O!“%7%s%%k$4$H$Ke(B String e$B$N%$%s%9%?%s%9$re(B  
> e$B3d$jEv$F$F%7%s%%kL\>$r4IM}$7$^$9$,!”$=$N$;$$$Ge(B GC e$B$N8zN($,Mn$A$Fe(B  
> e$B$$$k$H;W$$$^$9!#e(B
> 
> String e$B$G$O$J$/e(B ALLOC e$B$GD\>@\3NJ]$7$?NN0h$G4IM}$9$k%Q%C%A$r=q$-$^e(B  
> e$B$7$?!#6KC\<$JNc$G$O$3$N$/$i$$Aa$/$J$j$^$9!#e(B  
> e$B!JCfN,!Ke(B  
> e$B$I$J$?$+DI;n$7$F$/$@$5$k$H=u$+$j$^$9!#;d$N4D6-$Ge(B make test-all e$B$Oe(B  
> e$BDL$C$F$$$^$9!#e(B

e$B6=L#$,$"$j$^$9$N$G;n$7$F$\_$?$H$3$m!"e(B  
e$B\>/$7IT;W5D$J7k2L$K$J$j$^$7$?$N$GJs9p$5$;$F$$$?$@$-$^$9!#e(B  
e$B\>:Y$O$o$+$j$^$;$s$,!“4D6-$,IO\<e$G$”$k$3$H$,4X78$7$F$$$k$H;W$o$l$^$9!#e(B

e$B@8$N%Y%s%A%^!\<%/7k2L$rKvHx$KE:IU$7$^$9!#e(B  
e$B$=$N$&$ABg$-$/:9$,$"$C$?$b$N$K$D$$$F!"2~$a$F:F8=@-$rD4$Y$^$7$?!#e(B

- e$BB.$/$J$C$?$b$N!“:F8=@-$”$je(B  
app\_pentomino : 185 - 187 e$BICe(B =\> 182 - 183 e$BICe(B  
so\_fannkuch : 194 - 195 e$BICe(B =\> 191 - 192 e$BICe(B  
so\_mandelbrot : 56.1 - 56.3 e$BICe(B =\> 48.2 - 48.3 e$BICe(B  
so\_nbody : 39.2 - 39.5 e$BICe(B =\> 34.4 - 35.0 e$BICe(B  
so\_partial\_sums : 54.3 - 54.5 e$BICe(B =\> 47.0 - 47.0 e$BICe(B  
so\_spectralnorm : 39.4 - 39.6 e$BICe(B =\> 35.4 - 35.5 e$BICe(B  
vm1\_block\* : 28.5 - 29.5 e$BICe(B =\> 22.5 - 22.8 e$BICe(B  
vm1\_const\* : 6.4 - 6.6 e$BICe(B =\> 5.5 - 5.5 e$BICe(B  
vm1\_not\* : 5.6 - 5.8 e$BICe(B =\> 4.1 - 4.2 e$BICe(B  
vm3\_gc : 10.4 - 10.5 e$BICe(B =\> 9.0 - 9.0 e$BICe(B

- e$BCY$/$J$C$?$b$N!“:F8=@-$”$je(B  
loop\_whileloop2 : 17.0 - 17.5 e$BICe(B =\> 18.0 - 18.5 e$BICe(B  
so\_ackermann : 8.6 - 8.7 e$BICe(B =\> 8.7 - 8.9 e$BICe(B  
so\_exception : 11.8 - 12.2 e$BICe(B =\> 12.8 - 13.4 e$BICe(B  
so\_meteor\_contest : 46.4 - 48.8 e$BICe(B =\> 50.4 - 51.2 e$BICe(B  
so\_reverse\_complement : 388 - 389 e$BICe(B =\> 391 - 392 e$BICe(B  
vm2\_eval\* : 195 - 198 e$BICe(B =\> 206 - 207 e$BICe(B

- e$B@8%G!\<%?$G$OJQ2=$,$“$C$?$,!”:F8=@-$N$J$$$b$Ne(B  
app\_tak : e$B%Q%C%AA08e$H$b$Ke(B 10.5 - 11.2 e$BICe(B  
io\_file\_read : e$B%Q%C%AA08e$H$b$Ke(B 39 - 42 e$BICe(B  
loop\_generator : e$B%Q%C%AA08e$H$b$Ke(B 5.6 - 6.2 e$BICe(B  
loop\_times : e$B%Q%C%AA08e$H$b$Ke(B 14.1 - 14.5 e$BICe(B  
so\_count\_words : e$B%Q%C%AA08e$H$b$Ke(B 2 - 5 e$BICe(B  
so\_array : e$B%Q%C%AA08e$H$b$Ke(B 13 - 19 e$BICe(B  
so\_sieve : e$B%Q%C%AA08e$H$b$Ke(B 1.3 - 4.2 e$BICe(B

benchmark results:  
name ruby 1.9.2dev (2009-12-06 trunk 26029) [i386-mingw32] ruby  
1.9.2dev (2009-12-06 trunk 26029) [i386-mingw32]  
app\_answer 0.766 0.797  
app\_erb 4.484 4.422  
app\_factorial 2.500 2.641  
app\_fib 7.797 7.984  
app\_mandelbrot 2.125 2.172  
app\_pentomino 187.578 183.078  
app\_raise 5.422 5.438  
app\_strconcat 3.313 3.172  
app\_tak 10.547 11.141  
app\_tarai 9.203 9.313  
app\_uri 8.828 8.391  
io\_file\_create 33.641 32.641  
io\_file\_read 39.219 42.203  
io\_file\_write 28.719 28.578  
loop\_for 15.875 15.875  
loop\_generator 5.719 6.125  
loop\_times 13.984 14.328  
loop\_whileloop 8.125 8.156  
loop\_whileloop2 1.734 1.844  
so\_ackermann 8.672 8.781  
so\_array 19.031 13.938  
so\_binary\_trees 3.906 4.016  
so\_concatenate 3.719 3.813  
so\_count\_words 5.734 6.844  
so\_exception 12.047 13.203  
so\_fannkuch 195.047 191.688  
so\_fasta 25.000 24.891  
so\_k\_nucleotide 16.469 16.797  
so\_lists 3.453 3.406  
so\_mandelbrot 56.344 48.313  
so\_matrix 4.172 4.266  
so\_meteor\_contest 46.438 50.484  
so\_nbody 39.297 34.922  
so\_nested\_loop 11.859 12.031  
so\_nsieve 28.922 29.125  
so\_nsieve\_bits 27.938 27.281  
so\_object 9.063 9.656  
so\_partial\_sums 54.563 47.047  
so\_pidigits 17.578 17.594  
so\_random 3.609 3.328  
so\_reverse\_complement 387.969 392.344  
so\_sieve 2.234 1.531  
so\_spectralnorm 39.375 35.422  
vm1\_block\* 29.516 22.875  
vm1\_const\* 6.438 5.547  
vm1\_ensure\* 2.344 2.250  
vm1\_ivar\* 7.844 7.547  
vm1\_ivar\_set\* 7.031 7.000  
vm1\_length\* 8.797 8.594  
vm1\_neq\* 6.547 6.922  
vm1\_not\* 5.688 4.172  
vm1\_rescue\* 2.328 2.250  
vm1\_simplereturn\* 13.078 12.797  
vm1\_swap\* 4.375 4.328  
vm2\_array\* 15.063 15.016  
vm2\_case\* 1.844 1.656  
vm2\_eval\* 195.141 206.078  
vm2\_method\* 19.266 19.016  
vm2\_mutex\* 12.469 12.422  
vm2\_poly\_method\* 24.109 24.188  
vm2\_poly\_method\_ov\* 2.344 2.328  
vm2\_proc\* 5.859 5.844  
vm2\_regexp\* 9.953 9.438  
vm2\_send\* 3.156 2.891  
vm2\_super\* 4.781 4.641  
vm2\_unif1\* 2.813 2.625  
vm2\_zsuper\* 5.500 5.406  
vm3\_gc 10.531 9.031  
vm3\_thread\_create\_join 27.234 27.828  
vm3\_thread\_mutex 3.000 3.188

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [April 22, 2010, 4:17pm UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879/4 "2010-04-22T16:17:21Z")

</div>

e$B%A%1%C%He(B #2447 e$B$,99?7$5$l$^$7$?!#e(B (by Yusuke E.)

e$B1sF#$G$9!#e(B

e$BL@$i$+$Ke(B feature request e$B$J$N$G0\F0$7$^$9!#e(B

## – Yusuke E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

[http://redmine.ruby-lang.org/issues/show/2447](http://redmine.ruby-lang.org/issues/show/2447)

---

<div class="post-metadata">

**Author:** ![Yusuke\_E](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/f08c70/32.png) [@Yusuke\_E](https://www.ruby-forum.com/u/Yusuke_E)\
**Post date:** [December 10, 2009, 6:25pm UTC](https://www.ruby-forum.com/t/bug-2447-reduce-gc-pressure-by-symbol-table-without-string-instance/179879/5 "2009-12-10T18:25:00Z")

</div>

e$B1sF#$G$9!#e(B

2009e$BG/e(B12e$B7ne(B8e$BF|e(B18:37 wanabe [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > e$B$I$J$?$+DI;n$7$F$/$@$5$k$H=u$+$j$^$9!#;d$N4D6-$Ge(B make test-all e$B$Oe(B  
> > e$BDL$C$F$$$^$9!#e(B
> 
> e$B6=L#$,$"$j$^$9$N$G;n$7$F$\_$?$H$3$m!"e(B  
> e$B\>/$7IT;W5D$J7k2L$K$J$j$^$7$?$N$GJs9p$5$;$F$$$?$@$-$^$9!#e(B  
> e$B\>:Y$O$o$+$j$^$;$s$,!“4D6-$,IO\<e$G$”$k$3$H$,4X78$7$F$$$k$H;W$o$l$^$9!#e(B
> 
> e$B@8$N%Y%s%A%^!\<%/7k2L$rKvHx$KE:IU$7$^$9!#e(B  
> e$B$=$N$&$ABg$-$/:9$,$"$C$?$b$N$K$D$$$F!"2~$a$F:F8=@-$rD4$Y$^$7$?!#e(B

e$B$H$F$b\>$7$$DI;n!“$”$j$,$H$&$4$6$$$^$9!#e(B

> vm3\_gc : 10.4 - 10.5 e$BICe(B =\> 9.0 - 9.0 e$BICe(B  
> e$B$=$l$\>$le(B 2% e$B!"e(B2% e$B!"e(B14% e$B!"e(B12% e$B!"e(B14%  
> e$B!"e(B10% e$B!"e(B21% e$B!"e(B15% e$B!"e(B27% e$B!"e(B13%  
> e$B$/$i$$$N9bB.2=$G$9$M!#e(B

> - e$BCY$/$J$C$?$b$N!“:F8=@-$”$je(B  
> loop\_whileloop2 : 17.0 - 17.5 e$BICe(B =\> 18.0 - 18.5 e$BICe(B  
> so\_ackermann : 8.6 - 8.7 e$BICe(B =\> 8.7 - 8.9 e$BICe(B  
> so\_exception : 11.8 - 12.2 e$BICe(B =\> 12.8 - 13.4 e$BICe(B  
> so\_meteor\_contest : 46.4 - 48.8 e$BICe(B =\> 50.4 - 51.2 e$BICe(B  
> so\_reverse\_complement : 388 - 389 e$BICe(B =\> 391 - 392 e$BICe(B  
> vm2\_eval\* : 195 - 198 e$BICe(B =\> 206 - 207 e$BICe(B

-6% e$B!"e(B-2% e$B!"e(B-9% e$B!"e(B-7% e$B!"e(B-1% e$B!"e(B-5%  
e$B$/$i$$$G$9$M!#e(B

e$BAm$8$F8@$($P!"B.$/$J$C$F$$$k$H8@$($k$N$G$O$J$$$+$H;W$$$^$9!#e(B  
e$B$I$&$G$7$g$&$+!#e(B
