[ruby-trunk - Feature #6218][Open] struct.cのrb struct s members m()について

Issue #6218 has been reported by Glass_saga (Masaki M.).


Feature #6218: struct.cのrb_struct_s_members_m()について

Author: Glass_saga (Masaki M.)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:

表題の関数ではrb_struct_s_members()で得たArrayの内容をwhile文で1要素ずつ新たなArrayにpushしていますが、
これはrb_ary_dup()で済ませられるのではないでしょうか。

パフォーマンス上のメリットもあります。

require ‘benchmark’

sym = :a
s = Struct.new(*Array.new(100){ sym = sym.succ })

Benchmark.bm do |x|
x.report do
1000.times { s.members }
end
end

以上のコードを実行したところ、以下の結果となりました。

trunk(r35158):
user system total real
0.000000 0.000000 0.000000 ( 0.003188)

proposal:
user system total real
0.000000 0.000000 0.000000 ( 0.000688)

patchを添付します。

Issue #6218 has been updated by mame (Yusuke E.).

Status changed from Open to Assigned
Assignee set to Glass_saga (Masaki M.)

なんで今そういう無駄なコードになっているか、というのを調べるといいです。
ひょっとしたら何か意味があるのかもしれないので。

この場合 r10847 を見ると、Struct#members が文字列からシンボルを返すように
変更したことで、こういうコードになったようです。
なので、昔は意味があったけれど今は本当にただの無駄だと思われます。

コミット権もらえたらやっといてください。


Yusuke E. [email protected]

Feature #6218: struct.cのrb_struct_s_members_m()について

Author: Glass_saga (Masaki M.)
Status: Assigned
Priority: Normal
Assignee: Glass_saga (Masaki M.)
Category:
Target version:

表題の関数ではrb_struct_s_members()で得たArrayの内容をwhile文で1要素ずつ新たなArrayにpushしていますが、
これはrb_ary_dup()で済ませられるのではないでしょうか。

パフォーマンス上のメリットもあります。

require ‘benchmark’

sym = :a
s = Struct.new(*Array.new(100){ sym = sym.succ })

Benchmark.bm do |x|
x.report do
1000.times { s.members }
end
end

以上のコードを実行したところ、以下の結果となりました。

trunk(r35158):
user system total real
0.000000 0.000000 0.000000 ( 0.003188)

proposal:
user system total real
0.000000 0.000000 0.000000 ( 0.000688)

patchを添付します。

Issue #6218 has been updated by mame (Yusuke E.).

Assignee changed from Glass_saga (Masaki M.) to mame (Yusuke
Endoh)

Glass_saga さんのコミッタ化にはもうちょっと時間がかかりそうみたいなので、
とりあえず私がやっちゃいます。


Yusuke E. [email protected]

Feature #6218: struct.cのrb_struct_s_members_m()について

Author: Glass_saga (Masaki M.)
Status: Assigned
Priority: Normal
Assignee: mame (Yusuke E.)
Category:
Target version:

表題の関数ではrb_struct_s_members()で得たArrayの内容をwhile文で1要素ずつ新たなArrayにpushしていますが、
これはrb_ary_dup()で済ませられるのではないでしょうか。

パフォーマンス上のメリットもあります。

require ‘benchmark’

sym = :a
s = Struct.new(*Array.new(100){ sym = sym.succ })

Benchmark.bm do |x|
x.report do
1000.times { s.members }
end
end

以上のコードを実行したところ、以下の結果となりました。

trunk(r35158):
user system total real
0.000000 0.000000 0.000000 ( 0.003188)

proposal:
user system total real
0.000000 0.000000 0.000000 ( 0.000688)

patchを添付します。

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

In message “Re: [ruby-dev:45665] [ruby-trunk - Feature #6218]
struct.c$B$N(Brb_struct_s_members_m()$B$K$D$$$F(B”
on Tue, 22 May 2012 00:11:56 +0900, “mame (Yusuke E.)”
[email protected] writes:

|Glass_saga $B$5$s$N%3%%C%?2=$K$O$b$&$A$g$C$H;~4V$,$+$+$j$=$&$$?$$$J$N$G!“(B
|$B$H$j$”$($:;d$,$d$C$A$c$$$^$9!#(B

$B;~4V$,$+$+$j$=$&$b$J$K$b!“$3$l!”;d$KD>@\0MMj$5$l$F$$$J$$$s$G(B
$B$9$,!#$b$7$+$7$F!"6u5$$rFI$s$G%3%_%C%?2=$r>5G’$9$k$H$+$7$J$$(B
$B$H$$$1$J$+$C$?!)(B

|Glass_saga $B$5$s$N%3%%C%?2=$K$O$b$&$A$g$C$H;~4V$,$+$+$j$=$&$$?$$$J$N$G!"(B
|$B$H$j$"$($:;d$,$d$C$A$c$$$^$9!#(B

$B;~4V$,$+$+$j$=$&$b$J$K$b!"$3$l!";d$KD>@\0MMj$5$l$F$$$J$$$s$G(B
$B$9$,!#$b$7$+$7$F!"6u5$$rFI$s$G%3%_%C%?2=$r>5G’$9$k$H$+$7$J$$(B
$B$H$$$1$J$+$C$?!)(B

$B$^$"$=$N!"$b$&$A$g$C$H$=$N$^$^%3%_%C%H$G$-$kN($,>e$,$C$F$+$i$G$$$$$H;W$$$^$9$h!#(B
$B$=$&$$$&0UL#$G!"$b$&$A$g$C$H;~4V$,$+$+$j$=$&$OBgJQ@5$7$$!#(B

$B1sF#$G$9!#(B

2012/05/22 Yukihiro M. [email protected]:

|Glass_saga $B$5$s$N%3%%C%?2=$K$O$b$&$A$g$C$H;~4V$,$+$+$j$=$&$$?$$$J$N$G!“(B
|$B$H$j$”$($:;d$,$d$C$A$c$$$^$9!#(B

$B;~4V$,$+$+$j$=$&$b$J$K$b!“$3$l!”;d$KD>@\0MMj$5$l$F$$$J$$$s$G(B
$B$9$,!#$b$7$+$7$F!"6u5$$rFI$s$G%3%_%C%?2=$r>5G’$9$k$H$+$7$J$$(B
$B$H$$$1$J$+$C$?!)(B

$B$9$$^$;$s!#(BGlass_saga $B$5$s$N%3%%C%?2=$O(B #6173
$B$N%A%1%C%HFb$G(B
$BDs0F$7$?$D$b$j$G$7$?!#(B[ruby-dev:45460]

$B$G$b$3$&$$$&OC$O%A%1%C%H$8$c$J$/$F%a!<%k$GAw$k$Y$-$G$9$M!#(B
$B?=$7Lu$J$$$G$9!#0J8e5$$r$D$1$^$9!#(B