# Faster Enumerator#each by rb\_block\_call with current block

**URL:** <https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143>\
**Category:** Development\
**Created:** [December 13, 2009, 4:59am UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143 "2009-12-13T04:59:22Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 13, 2009, 4:59am UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/1 "2009-12-13T04:59:22Z")

</div>

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

e$B8=:\_$Ne(B Enumerator#each e$B$O!"e(B1 e$B2s$N%V%m%C%/8F$S=P$7$Ge(B 2  
e$B2sJ,$Ne(B yield e$B$r\<B9Te(B  
e$B$7$F$$$^$9!#e(B

1. Enumerator#each e$B$,85$N%a%=%C%I$re(B rb\_block\_call e$B$G8F$Ve(B  
(e$B$3$N$H$-%V%m%C%/$H$7$Fe(B enumerator\_each\_i e$B$rM?$($ke(B)
2. e$B85$N%a%=%C%I$,e(B yield e$B$7$F8=:\_$N%V%m%C%/e(B  
(enumerator\_each\_i) e$B$r8F$Ve(B
3. enumerator\_each\_i e$B$,e(B yield e$B$7$F\<B:]$N%V%m%C%/$r8F$Ve(B

e$B$=$3$Ge(B rb\_block\_call  
e$B$K8=:_$N%V%m%C%/$rEO$;$k$h$&$K$7$F$_$^$7$?!#e(B  
e$B$3$&$9$k$H!"e(Byield e$B$Oe(B 1 e$B2s$G:Q$\_$^$9!#e(B

1. Enumerator#each e$B$,85$N%a%=%C%I$re(B rb\_block\_call e$B$G8F$Ve(B  
(e$B$3$N$H$-%V%m%C%/$H$7$F8=:\_$N%V%m%C%/$r$=$N$^$^EO$9e(B)
2. e$B85$N%a%=%C%I$,e(B yield e$B$7$F\<B:]$N%V%m%C%/$r8F$Ve(B

e$B0J2\<$N%Y%s%A%^!\<%/$G;n$9$H!"%Q%C%AA0$Ge(B 1.49 e$BIC!"%Q%C%A8e$Ge(B  
1.00 e$BIC$He(B  
e$B$J$j$^$7$?!#e(B

GC.disable  
a = [0] \* 5000000  
t = Time.now  
a.to\_enum.each {|x| }  
p Time.now - t

e$B$A$J$\_$Ke(B a.to\_enum.each e$B$NBe$o$j$Ke(B a.each  
e$B$HD\>@\8F$s$@\>l9g$G$be(B 1.00 e$BICe(B  
e$B$G$9!#%a%=%C%I$r%Y!\<%9$H$7$?e(B Enumerator e$B$,e(B to\_enum  
e$B$7$J$$\>l9g$HB=?’$J$$e(B  
e$BB.EY$K$J$C$?$H;W$$$^$9!#e(B

e$B$3$NOC$Oe(B Enumerator e$B$KFC2=$7$?OC$G$O$J$/!"e(BARGF.each\_line  
e$B$de(B each\_byte  
e$B$J$I$bF1$8$h$&$Ke(B 2 e$BCJ3,e(B yield  
e$B$K$J$C$F$$$?$N$G!"8=:\_$N%V%m%C%/$rD\>@\e(B  
e$BEO$9$h$&$K$7$?$H$3$m!"0J2\<$,e(B 0.20 e$BIC$+$ie(B 0.18  
e$BIC$K9bB.2=$7$^$7$?!#e(B

ruby -e ‘$\<.each\_line {|l| }’ \*.c

e$B6qBNE\*$J%Q%C%A$NFbMF$O!"e(Brb\_block\_call e$B$Ne(B bl\_proc e$B$Ke(B  
NULL e$B$,EO$5$l$?$ie(B  
e$B8=:_$N%V%m%C%/$r;H$&$h$&$K$9$k$H$$$&$b$N$G$9!#e(B  
e$B%3%_%C%H$7$F$b$$$$$G$7$g$&$+!#e(B

diff --git a/enumerator.c b/enumerator.c  
index 7c50f3d…34d16c0 100644  
— a/enumerator.c  
+++ b/enumerator.c  
@@ -330,12 +330,6 @@ enumerator\_allocate(VALUE klass)  
}

static VALUE  
-enumerator\_each\_i(VALUE v, VALUE enum\_obj, int argc, VALUE \*argv)  
-{

- return rb\_yield\_values2(argc, argv);  
-}
- 

-static VALUE  
enumerator\_init(VALUE enum\_obj, VALUE obj, VALUE meth, int argc, VALUE  
\*argv)  
{  
struct enumerator \*ptr;  
@@ -473,7 +467,7 @@ static VALUE  
enumerator\_each(VALUE obj)  
{  
if (!rb\_block\_given\_p()) return obj;

- return enumerator\_block\_call(obj, enumerator\_each\_i, obj);

- return enumerator\_block\_call(obj, 0, obj);  
}

static VALUE  
diff --git a/io.c b/io.c  
index 643455e…3b8bd25 100644  
— a/io.c  
+++ b/io.c  
@@ -9148,7 +9148,7 @@ argf\_each\_line(int argc, VALUE \*argv, VALUE argf)  
RETURN\_ENUMERATOR(argf, argc, argv);  
for (;😉 {  
if (!next\_argv()) return argf;

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_line”), argc, argv,  
rb\_yield, 0);

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_line”), argc, argv,  
0, 0);  
ARGF.next\_p = 1;  
}  
}  
@@ -9182,7 +9182,7 @@ argf\_each\_byte(VALUE argf)  
RETURN\_ENUMERATOR(argf, 0, 0);  
for (;😉 {  
if (!next\_argv()) return argf;

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_byte”), 0, 0,  
rb\_yield, 0);

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_byte”), 0, 0, 0, 0);  
ARGF.next\_p = 1;  
}  
}  
@@ -9212,7 +9212,7 @@ argf\_each\_char(VALUE argf)  
RETURN\_ENUMERATOR(argf, 0, 0);  
for (;😉 {  
if (!next\_argv()) return argf;

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_char”), 0, 0,  
rb\_yield, 0);

- rb\_block\_call(ARGF.current\_file, rb\_intern(“each\_char”), 0, 0, 0, 0);  
ARGF.next\_p = 1;  
}  
}  
diff --git a/vm\_eval.c b/vm\_eval.c  
index f0b2316…9276f0a 100644  
— a/vm\_eval.c  
+++ b/vm\_eval.c  
@@ -828,9 +828,15 @@ rb\_iterate(VALUE (\* it\_proc) (VALUE), VALUE data1,  
if (state == 0) {  
iter\_retry:  
{

- 

```
 rb_block_t *blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp);

```

- 

```
 blockptr->iseq = (void *)node;

```

- 

```
 blockptr->proc = 0;

```

- 

```
 rb_block_t *blockptr;

```

- 

```
 if (bl_proc) {

```

- blockptr = RUBY\_VM\_GET\_BLOCK\_PTR\_IN\_CFP(th-\>cfp);
- blockptr-\>iseq = (void \*)node;
- blockptr-\>proc = 0;
- 

```
 }

```

- 

```
 else {

```

- blockptr = GC\_GUARDED\_PTR\_REF(th-\>cfp-\>lfp[0]);
- 

```
 }
 th->passed_block = blockptr;

```

}  
retval = (\*it\_proc) (data1);

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 19, 2009, 9:00am UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/2 "2009-12-19T09:00:15Z")

</div>

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

In message “Re: [ruby-dev:39874] faster Enumerator#each by rb\_block\_call  
with current block”  
on Sun, 13 Dec 2009 12:58:51 +0900, Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B1sF#$G$9!#e(B  
|  
|e$B8=:\_$Ne(B Enumerator#each e$B$O!"e(B1 e$B2s$N%V%m%C%/8F$S=P$7$Ge(B 2 e$B2sJ,$Ne(B yield e$B$r\<B9Te(B  
|e$B$7$F$$$^$9!#e(B

|e$B$=$3$Ge(B rb\_block\_call e$B$K8=:_$N%V%m%C%/$rEO$;$k$h$&$K$7$F$_$^$7$?!#e(B  
|e$B$3$&$9$k$H!"e(Byield e$B$Oe(B 1 e$B2s$G:Q$\_$^$9!#e(B

|e$B6qBNE\*$J%Q%C%A$NFbMF$O!"e(Brb\_block\_call e$B$Ne(B bl\_proc e$B$Ke(B NULL e$B$,EO$5$l$?$ie(B  
|e$B8=:_$N%V%m%C%/$r;H$&$h$&$K$9$k$H$$$&$b$N$G$9!#e(B  
|e$B%3%_%C%H$7$F$b$$$$$G$7$g$&$+!#e(B

e$B$H$j$“$($:%”%$%G%#%"$OM-8z$=$&$J$N$G!"8\_49@-LdBj$,$J$1$l$PF3e(B  
e$BF~$7$F$b$h$$$N$G$O$J$$$G$7$g$&$+!#%3%\_%C%H$7$F$/$@$5$$!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 20, 2009, 1:33pm UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/3 "2009-12-20T13:33:51Z")

</div>

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

2009e$BG/e(B12e$B7ne(B19e$BF|e(B16:59 Yukihiro M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> |e$B6qBNE\*$J%Q%C%A$NFbMF$O!"e(Brb\_block\_call e$B$Ne(B bl\_proc e$B$Ke(B NULL e$B$,EO$5$l$?$ie(B  
> |e$B8=:_$N%V%m%C%/$r;H$&$h$&$K$9$k$H$$$&$b$N$G$9!#e(B  
> |e$B%3%_%C%H$7$F$b$$$$$G$7$g$&$+!#e(B
> 
> e$B$H$j$“$($:%”%$%G%#%"$OM-8z$=$&$J$N$G!"8\_49@-LdBj$,$J$1$l$PF3e(B  
> e$BF~$7$F$b$h$$$N$G$O$J$$$G$7$g$&$+!#%3%\_%C%H$7$F$/$@$5$$!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#e(B  
e$B$J$+$@$5$s$K$h$C$F$A$g$C$H=$@5$5$l$?%Q%C%A$r%3%\_%C%H$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 20, 2009, 2:18pm UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/4 "2009-12-20T14:18:56Z")

</div>

2009e$BG/e(B12e$B7ne(B20e$BF|e(B21:33 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$J$+$@$5$s$K$h$C$F$A$g$C$H=$@5$5$l$?%Q%C%A$r%3%\_%C%H$7$^$7$?!#e(B

test-all e$B$,Mn$A$F$$$^$9$M!#e(B

[http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091220T214000.log.txt.gz](http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091220T214000.log.txt.gz)

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 20, 2009, 6:08pm UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/5 "2009-12-20T18:08:58Z")

</div>

2009e$BG/e(B12e$B7ne(B20e$BF|e(B23:27 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> e$B$3$NLdBj$N860x$O$h$/$o$+$C$F$J$$$s$G$9$,!“$H$j$”$($:1sF#$Ne(B  
> e$B85$N%Q%C%Ae(B ([ruby-dev:39874]) e$B$J$iH/\>I$7$J$$$H;W$$$^$9$N$Ge(B  
> e$B$=$C$A$G%3%\_%C%H$7$J$\*$7$^$7$?!#e(B

e$BD\>$C$?46$8$O$7$^$;$s$M$'!#e(B

[http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091221T014100.log.txt.gz](http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091221T014100.log.txt.gz)

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 20, 2009, 3:32pm UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/6 "2009-12-20T15:32:06Z")

</div>

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

2009e$BG/e(B12e$B7ne(B20e$BF|e(B22:18 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 2009e$BG/e(B12e$B7ne(B20e$BF|e(B21:33 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > e$B$J$+$@$5$s$K$h$C$F$A$g$C$H=$@5$5$l$?%Q%C%A$r%3%\_%C%H$7$^$7$?!#e(B
> 
> test-all e$B$,Mn$A$F$$$^$9$M!#e(B
> 
> [http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091220T214000.log.txt.gz](http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20091220T214000.log.txt.gz)

e$B$“$”$“!”$9$\_$^$;$s!#e(B  
test-all e$B$7$?$D$b$j$@$C$?$s$G$9$,2?$+4V0c$($?$h$&$G$9!#e(B

e$B$3$NLdBj$N860x$O$h$/$o$+$C$F$J$$$s$G$9$,!“$H$j$”$($:1sF#$Ne(B  
e$B85$N%Q%C%Ae(B ([ruby-dev:39874]) e$B$J$iH/\>I$7$J$$$H;W$$$^$9$N$Ge(B  
e$B$=$C$A$G%3%\_%C%H$7$J$\*$7$^$7$?!#e(B

(e$BK:$l$+$1$F$^$7$?$,e(B) e$B1sF#$b:G=i$O$J$+$@$5$s$HF1$8$h$&$Je(B  
e$B%Q%C%A$r=q$$$F!“$3$Ne(B SEGV e$B$KAx6x$7$F!”$h$/$o$+$i$J$+$C$?$N$Ge(B  
e$B6KNOM\>7W$J$H$3$m$r$$$8$i$J$$%Q%C%A$K$7$?$N$G$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [December 20, 2009, 6:54pm UTC](https://www.ruby-forum.com/t/faster-enumerator-each-by-rb-block-call-with-current-block/180143/7 "2009-12-20T18:54:36Z")

</div>

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

2009e$BG/e(B12e$B7ne(B21e$BF|e(B2:08 Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 2009e$BG/e(B12e$B7ne(B20e$BF|e(B23:27 Yusuke ENDOH [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > e$B$3$NLdBj$N860x$O$h$/$o$+$C$F$J$$$s$G$9$,!“$H$j$”$($:1sF#$Ne(B  
> > e$B85$N%Q%C%Ae(B ([ruby-dev:39874]) e$B$J$iH/\>I$7$J$$$H;W$$$^$9$N$Ge(B  
> > e$B$=$C$A$G%3%\_%C%H$7$J$\*$7$^$7$?!#e(B
> 
> e$BD\>$C$?46$8$O$7$^$;$s$M$'!#e(B

e$B$?$S$?$S$9$\_$^$;$s!#85$N%Q%C%A$NDL$j$K$7$=$3$M$F$$$^$7$?!#e(B  
e$B:#EY$3$=D\>$C$?e(B (e$B$i$$$$$Je(B) e$B!#e(B

e$B?dB,$G$9$,!"e(Brb\_iterate e$B$NJQ?te(B node e$B$,e(B converative GC  
e$B$K$h$C$F%^!\<%/e(B  
e$B$5$l$F$k\>u67$J$s$G$9$+$M!#e(B
