# Nonlinear performance of each\_char

**URL:** <https://www.ruby-forum.com/t/nonlinear-performance-of-each-char/126561>\
**Category:** Development\
**Created:** [January 19, 2008, 5:07pm UTC](https://www.ruby-forum.com/t/nonlinear-performance-of-each-char/126561 "2008-01-19T17:07:33Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 19, 2008, 5:07pm UTC](https://www.ruby-forum.com/t/nonlinear-performance-of-each-char/126561/1 "2008-01-19T17:07:33Z")

</div>

String#each\_char e$B$N=hM};~4V$,J8;zNsD9$KHfNc$7$J$$46$8$G$9!#e(B

% ./ruby -v -e ’  
c = “\xa1\xa1”.force\_encoding(“euc-jp”);  
1000.step(20000, 1000) {|n|  
s = c \* n  
t1 = Process.times.utime  
s.each\_char {|x| }  
t2 = Process.times.utime  
p t2 - t1  
}  
’  
ruby 1.9.0 (2008-01-19 revision 0) [i686-linux]  
0.09  
0.35  
0.8  
1.41  
2.22  
3.21  
4.34  
5.68  
7.14  
8.85  
10.62  
12.63  
14.8  
17.15  
19.7  
22.38  
25.25  
28.25  
31.47  
34.9

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 20, 2008, 3:17am UTC](https://www.ruby-forum.com/t/nonlinear-performance-of-each-char/126561/2 "2008-01-20T03:17:47Z")

</div>

e$B$J$+$@$G$9!#e(B

At Sun, 20 Jan 2008 01:07:05 +0900,  
Tanaka A. wrote in [ruby-dev:33189]:

> String#each\_char e$B$N=hM};~4V$,J8;zNsD9$KHfNc$7$J$$46$8$G$9!#e(B

e$BKh2se(Brb\_str\_substr()e$B$NCf$G@hF,$+$iC5$7$F$$$k$+$i$G$9$M!#e(B

e$B%V%m%C%/$NCf$GJQ99$5$l$k$H$A$g$C$H$\*$+$7$J$3$H$K$J$k$+$b$7$l$^$;e(B  
e$B$s$,!"$=$s$J$K\<u$1F~$l$,$?$$@)8B$G$O$J$$$H;W$$$^$9!#e(B

# Index: string.c

— string.c (revision 15137)  
+++ string.c (working copy)  
@@ -4591,9 +4591,20 @@ static VALUE  
rb\_str\_each\_char(VALUE str)  
{

- int i, len = str\_strlen(str, 0);

- int i, len, n;

- const char \*ptr, \*s;

- rb\_encoding \*enc;

- for (i=0; i\<len; i++) {
- rb\_yield(rb\_str\_substr(str, i, 1));

- ptr = RSTRING\_PTR(str);
- len = RSTRING\_LEN(str);
- enc = rb\_enc\_get(str);
- n = rb\_enc\_precise\_mbclen(ptr, ptr + len, enc);
- for (i = 0; i \< len; i += n) {
- rb\_yield(rb\_str\_subseq(str, i, n));
- ptr = RSTRING\_PTR(str);
- len = RSTRING\_LEN(str);
- enc = rb\_enc\_get(str);
- s = rb\_enc\_left\_char\_head(ptr, ptr + i, enc);
- n = rb\_enc\_precise\_mbclen(s, ptr + len, enc);  
}  
return str;

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [January 20, 2008, 3:24am UTC](https://www.ruby-forum.com/t/nonlinear-performance-of-each-char/126561/3 "2008-01-20T03:24:13Z")

</div>

e$B;n$7$F$^$;$s$,!"e(B

In article [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid),  
Nobuyoshi N. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

> - n = rb\_enc\_precise\_mbclen(ptr, ptr + len, enc);
> - for (i = 0; i \< len; i += n) {
> - rb\_yield(rb\_str\_subseq(str, i, n));

rb\_enc\_precise\_mbclen e$B$OIi$NCM$rJV$9$3$H$,$“$k$N$G!”$h$m$7$/e(B  
e$B$J$$$h$&$K;W$$$^$9!#e(B

e$BJV$jCM$r8!::$7$J$J$ie(B rb\_enc\_mbclen e$B$G$$$$$N$G$O$J$$$G$7$g$&e(B  
e$B$+!#e(B
