https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2009-02-26T03:44:31Z
Ruby Issue Tracking System
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3351
2009-02-26T03:44:31Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
ささだです.</p>
<p>Yukihiro Matsumoto wrote::</p>
<blockquote>
<p>最近、AO Benchを見ています。<a href="http://lucille.atso-net.jp/aobench/" class="external">http://lucille.atso-net.jp/aobench/</a><br>
実行時間の1/3はGCが消費していて涙目。</p>
</blockquote>
<p> そこで,Flonum 最適化を....</p>
<p> あと,インスタンス変数のキャッシュを用いた最適化してねーじゃん,と最近<br>
指摘されたので,近日中にやろうと思います.</p>
<blockquote>
<p>それはそれとして、AO Benchの中には</p>
<pre><code>nphi.times do |j|
ntheta.times do |i|
</code></pre>
<p>のような多重ループがあります。これを</p>
<p>nloop(nphi, ntheta) do |j,i|</p>
<p>というように書けたら、よりわかりやすく、かつ、やや高速なので<br>
はないかと考えました。実際に実装したところ、AO Benchでは5%程<br>
度実行時間が短縮されるようです。</p>
</blockquote>
<p> こういうパターンが多くあるのなら,いいんでないでしょうか.でも,速度の<br>
ために,ってのはあんまり Ruby 的じゃないような気がします(とか俺が言う<br>
なって感じですか).</p>
<blockquote>
<ul>
<li>そもそも必要なのか。YARVではややブロック呼び出しが重い傾<br>
向があるので効果があったが、よりブロック呼び出しが軽量に<br>
なれば不要ではないか</li>
</ul>
</blockquote>
<p> もうちょっと軽くなるようにしたいと思うんですがねぇ.あと,こういうのは<br>
C で書くよりも Ruby で書いた方が速いかも.</p>
<a name="あとruby-dev38058-に返事下さい"></a>
<h1 >あと,<a href="https://blade.ruby-lang.org/ruby-dev/38058">[ruby-dev:38058]</a> に返事下さい.<a href="#あとruby-dev38058-に返事下さい" class="wiki-anchor">¶</a></h1>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3353
2009-02-26T04:01:11Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="https://blade.ruby-lang.org/ruby-dev/38081">[ruby-dev:38081]</a> Re: [Feature:trunk] nested loop construct"<br>
on Thu, 26 Feb 2009 03:43:31 +0900, SASADA Koichi <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> writes:</p>
<p>| そこで,Flonum 最適化を....</p>
<p>完成度が高ければ反対はしません。でも自分でやるのは、私の手に<br>
は負えません。どうせ使ってるのはlong=64bitでないマシンだし。</p>
<p>| あと,インスタンス変数のキャッシュを用いた最適化してねーじゃん,と最近<br>
|指摘されたので,近日中にやろうと思います.</p>
<p>期待してます。</p>
<p>|> nloop(nphi, ntheta) do |j,i|<br>
|><br>
|> というように書けたら、よりわかりやすく、かつ、やや高速なので<br>
|> はないかと考えました。実際に実装したところ、AO Benchでは5%程<br>
|> 度実行時間が短縮されるようです。<br>
|<br>
| こういうパターンが多くあるのなら,いいんでないでしょうか.</p>
<p>AO Benchのような画像系だと結構ありそうな気がします。普段その<br>
系のプログラミングに縁がないんで自信はないですが。</p>
<p>|でも,速度の<br>
|ために,ってのはあんまり Ruby 的じゃないような気がします(とか俺が言う<br>
|なって感じですか).</p>
<p>速度だけのためならそうなんですが、一応わかりやすそうな気がす<br>
るというのもあるんで。</p>
<p>|> * そもそも必要なのか。YARVではややブロック呼び出しが重い傾<br>
|> 向があるので効果があったが、よりブロック呼び出しが軽量に<br>
|> なれば不要ではないか<br>
|<br>
| もうちょっと軽くなるようにしたいと思うんですがねぇ.あと,こういうのは<br>
|C で書くよりも Ruby で書いた方が速いかも.</p>
<p>そうか。ちょっとやってみよう。</p>
<p>|# あと,<a href="https://blade.ruby-lang.org/ruby-dev/38058">[ruby-dev:38058]</a> に返事下さい.</p>
<p>しました。</p>
<pre><code> まつもと ゆきひろ /:|)
</code></pre>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3354
2009-02-26T04:44:51Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="https://blade.ruby-lang.org/ruby-dev/38083">[ruby-dev:38083]</a> Re: [Feature:trunk] nested loop construct"<br>
on Thu, 26 Feb 2009 04:00:11 +0900, Yukihiro Matsumoto <a href="mailto:matz@ruby-lang.org" class="email">matz@ruby-lang.org</a> writes:</p>
<p>|| もうちょっと軽くなるようにしたいと思うんですがねぇ.あと,こういうのは<br>
||C で書くよりも Ruby で書いた方が速いかも.<br>
|<br>
|そうか。ちょっとやってみよう。</p>
<p>やってみました。残念ながら50%くらい遅くなってオリジナルより<br>
も低速でした。</p>
<p>オリジナル: 262秒<br>
nloop(C版): 249秒<br>
nloop(Ruby): 375秒</p>
<p>ブロック呼び出しはRubyからの方が速いのですが、それよりもメソッ<br>
ド呼び出しの少なさの方が効くようです。Ruby版nloopの作りが悪い<br>
せいかもしれません</p>
<p>def nloop(*args, &block)<br>
helper = ->(args, buf, offset, block) {<br>
limit = args[offset]<br>
if (offset+1 == args.size)<br>
limit.times do|i|<br>
buf[offset] = i<br>
block.yield *buf<br>
end<br>
else<br>
limit.times do|i|<br>
buf[offset] = i<br>
helper.(args, buf, offset+1, block)<br>
end<br>
end<br>
}<br>
helper.(args, [], 0, block)<br>
end</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3355
2009-02-26T05:17:45Z
ko1 (Koichi Sasada)
<ul></ul><p>=begin<br>
Yukihiro Matsumoto wrote::</p>
<blockquote>
<p>def nloop(*args, &block)<br>
helper = ->(args, buf, offset, block) {<br>
limit = args[offset]<br>
if (offset+1 == args.size)<br>
limit.times do|i|<br>
buf[offset] = i<br>
block.yield *buf<br>
end<br>
else<br>
limit.times do|i|<br>
buf[offset] = i<br>
helper.(args, buf, offset+1, block)<br>
end<br>
end<br>
}<br>
helper.(args, [], 0, block)<br>
end</p>
</blockquote>
<p> うわー,はじめてみました. -> とか .() とか.</p>
<p>def nloop *args<br>
str = ''<br>
h = lambda{|i|<br>
next "yield #{(0...i).map{|e| "v#{e}"}.join(', ')}\n" <br>
if args.length == 0</p>
<pre><code> str << "v#{i} = 0; while v#{i} < #{args.shift}\n"
str << h.call(i+1)
str << "v#{i} = v#{i}.succ;end\n"
''
</code></pre>
<p>}<br>
h.call(0)<br>
eval(str)<br>
end</p>
<p>require 'benchmark'<br>
max = 10000<br>
Benchmark.bm{|x|<br>
x.report{<br>
max.times{|i|<br>
max.times{|j|<br>
}<br>
}<br>
}<br>
x.report{<br>
nloop(max, max){|i, j|<br>
}<br>
}<br>
}</p>
<p>ruby 1.9.1p0 (2009-02-02 revision 21960) [i386-mswin32_90]<br>
t.rb:12: warning: useless use of a variable in void context<br>
user system total real<br>
15.039000 0.000000 15.039000 ( 13.957000)<br>
12.105000 0.031000 12.136000 ( 11.492000)</p>
<p>ruby 1.8.7 (2008-12-11 revision 20371) [i386-mswin32_90]<br>
t.rb:12: warning: useless use of a variable in void context<br>
user system total real<br>
10.671000 0.016000 10.687000 ( 10.642000)<br>
t.rb:13:in <code>nloop': (eval):3:in </code>nloop': no block given (LocalJumpError)<br>
from t.rb:26:in <code>eval' from t.rb:13:in </code>nloop'<br>
from t.rb:26<br>
from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:293:in <code>measure' from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:380:in </code>report'<br>
from t.rb:25<br>
from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:177:in <code>benchmark' from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:207:in </code>bm'<br>
from t.rb:18</p>
<ol>
<li>あれー,1.8.7 のほうが times{times{}} が速い なんでー?</li>
<li>eval() の中から yield 出来ないんだっけ?</li>
</ol>
<p>Debian etch/amd64</p>
<p>ruby 1.9.2dev (2009-02-26 trunk 22636) [x86_64-linux]<br>
user system total real<br>
7.840000 0.000000 7.840000 ( 7.836987)<br>
7.900000 0.000000 7.900000 ( 7.900081)</p>
<p>ruby 1.8.5 (2006-08-25) [x86_64-linux]<br>
user system total real<br>
30.340000 12.900000 43.240000 ( 43.247637)<br>
../trunk/test.rb:8:in <code><<': can't convert nil into String (TypeError) from ../trunk/test.rb:8:in </code>nloop'<br>
from ../trunk/test.rb:8:in <code>call' from ../trunk/test.rb:8:in </code>nloop'<br>
from ../trunk/test.rb:12:in <code>call' from ../trunk/test.rb:12:in </code>nloop'<br>
from ../trunk/test.rb:26<br>
from /usr/lib/ruby/1.8/benchmark.rb:293:in <code>measure' from /usr/lib/ruby/1.8/benchmark.rb:377:in </code>report'<br>
from ../trunk/test.rb:25<br>
from /usr/lib/ruby/1.8/benchmark.rb:177:in <code>benchmark' from /usr/lib/ruby/1.8/benchmark.rb:207:in </code>bm'<br>
from ../trunk/test.rb:18</p>
<ol start="3">
<li>1.9 でも times{times{}} のほうが速い−.なんでー?</li>
<li>1.8.7 とバックトレースが違う−.</li>
</ol>
<p>--<br>
// SASADA Koichi at atdot dot net</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3359
2009-02-26T14:05:59Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="https://blade.ruby-lang.org/ruby-dev/38085">[ruby-dev:38085]</a> Re: [Feature:trunk] nested loop construct"<br>
on Thu, 26 Feb 2009 05:16:41 +0900, SASADA Koichi <a href="mailto:ko1@atdot.net" class="email">ko1@atdot.net</a> writes:</p>
<p>|ruby 1.9.1p0 (2009-02-02 revision 21960) [i386-mswin32_90]<br>
|t.rb:12: warning: useless use of a variable in void context<br>
| user system total real<br>
| 15.039000 0.000000 15.039000 ( 13.957000)<br>
| 12.105000 0.031000 12.136000 ( 11.492000)</p>
<p>手元で実行したらこんな感じでした。</p>
<p>ruby 1.9.2dev (2009-02-25 trunk 22621) [i686-linux]<br>
user system total real<br>
8.920000 0.020000 8.940000 ( 9.038252) # while<br>
9.440000 0.000000 9.440000 ( 9.791861) # C版<br>
10.270000 0.010000 10.280000 ( 10.388291) # ささだ版<br>
43.400000 0.080000 43.480000 ( 43.973651) # まつもと版</p>
<p>関数的プログラミング遅すぎ。さらに涙目。</p>
<p>|ruby 1.8.7 (2008-12-11 revision 20371) [i386-mswin32_90]<br>
|t.rb:12: warning: useless use of a variable in void context<br>
| user system total real<br>
| 10.671000 0.016000 10.687000 ( 10.642000)<br>
|t.rb:13:in <code>nloop': (eval):3:in </code>nloop': no block given (LocalJumpError)<br>
| from t.rb:26:in <code>eval' | from t.rb:13:in </code>nloop'<br>
| from t.rb:26<br>
| from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:293:in <code>measure' | from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:380:in </code>report'<br>
| from t.rb:25<br>
| from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:177:in <code>benchmark' | from c:/tmp/ruby_1_8/lib/ruby/1.8/benchmark.rb:207:in </code>bm'<br>
| from t.rb:18<br>
|<br>
|1. あれー,1.8.7 のほうが times{times{}} が速い なんでー?</p>
<p>なんででしょう?</p>
<p>|2. eval() の中から yield 出来ないんだっけ?</p>
<p>できるはずです。</p>
<p>def doo<br>
eval("yield 42")<br>
end<br>
doo{|x| p x} # => 42</p>
<p>なんでだろう。evalの中でさらにevalするから?</p>
<pre><code> まつもと ゆきひろ /:|)
</code></pre>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3364
2009-02-26T14:53:05Z
yugui (Yuki Sonoda)
yugui@yugui.jp
<ul></ul><p>=begin<br>
Yuguiです。</p>
<p>On 2/26/09 3:33 AM, Yukihiro Matsumoto wrote:</p>
<blockquote>
<p>検討事項は</p>
<ul>
<li>名前。今回はnested loopということでnloopという名前で実装<br>
したが、もっと適切な名前があるかもしれない。妙な短縮形よ<br>
りも長くても記述的な名前を好む人も多いかも。Ruby(というか<br>
私)は前者を好む傾向はあるけど</li>
</ul>
</blockquote>
<p>Array#productがカルテシアン積なので、それに合わせてEnumerator#productで</p>
<p>nphi.product(ntheta).each {} や<br>
(nphi * ntheta).each {}</p>
<p>というのはどうですか? 非常に直感的だと感じます。</p>
<p>--<br>
Yugui <a href="mailto:yugui@yugui.jp" class="email">yugui@yugui.jp</a><br>
<a href="http://yugui.jp" class="external">http://yugui.jp</a><br>
私は私をDumpする</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3378
2009-02-27T19:54:31Z
kou (Kouhei Sutou)
kou@cozmixng.org
<ul></ul><p>=begin<br>
須藤です。</p>
<p>In <a href="mailto:86d4d5pq3f.knu@iDaemons.org" class="email">86d4d5pq3f.knu@iDaemons.org</a><br>
"<a href="https://blade.ruby-lang.org/ruby-dev/38095">[ruby-dev:38095]</a> Re: [Feature:trunk] nested loop construct" on Thu, 26 Feb 2009 17:18:15 +0900,<br>
"Akinori MUSHA" <a href="mailto:knu@iDaemons.org" class="email">knu@iDaemons.org</a> wrote:</p>
<blockquote>
<p>At Thu, 26 Feb 2009 14:52:05 +0900,<br>
Yugui wrote:</p>
<blockquote>
<p>On 2/26/09 3:33 AM, Yukihiro Matsumoto wrote:</p>
<blockquote>
<p>検討事項は</p>
<ul>
<li>名前。今回はnested loopということでnloopという名前で実装<br>
したが、もっと適切な名前があるかもしれない。妙な短縮形よ<br>
りも長くても記述的な名前を好む人も多いかも。Ruby(というか<br>
私)は前者を好む傾向はあるけど</li>
</ul>
</blockquote>
<p>Array#productがカルテシアン積なので、それに合わせてEnumerator#productで</p>
<p>nphi.product(ntheta).each {} や</p>
</blockquote>
<p> インスタンスメソッド形式は、(Array#zip 等でも感じることですが)<br>
3つ以上あるときに、本来対等な関係にも関わらず</p>
<pre><code>v1.product(v2, v3)
</code></pre>
<p>とか</p>
<pre><code>v, *vs = *vectors
v.product(*vs)
</code></pre>
<p>と「主」を立てないといけないのがどうも気に入らないんですよね。</p>
</blockquote>
<p>「対象とするv全体」が「主」っぽい気がするので、<br>
[v1, v2, v3].product<br>
がいいなぁと思いました。</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=3413
2009-03-03T18:38:53Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul></ul><p>=begin<br>
まつもと ゆきひろです</p>
<p>In message "Re: <a href="https://blade.ruby-lang.org/ruby-dev/38094">[ruby-dev:38094]</a> Re: [Feature:trunk] nested loop construct"<br>
on Thu, 26 Feb 2009 14:52:05 +0900, "Yugui (Yuki Sonoda)" <a href="mailto:yugui@yugui.jp" class="email">yugui@yugui.jp</a> writes:</p>
<p>|Array#productがカルテシアン積なので、それに合わせてEnumerator#productで<br>
|<br>
|nphi.product(ntheta).each {} や<br>
|(nphi * ntheta).each {}<br>
|<br>
|というのはどうですか? 非常に直感的だと感じます。</p>
<p>私がイメージしていたのは単純な多重ループなので、productとか配<br>
列の積とかは、むしろやりたいこととの距離が遠い気がします。ま<br>
た、カルテシアン積を導入するのであれば、Vectorとかのような別<br>
のクラスが望ましいような気がします。Enumeratorに必要な気はあ<br>
んまりしません。</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=5852
2009-09-18T04:29:04Z
marcandre (Marc-Andre Lafortune)
marcandre-ruby-core@marc-andre.ca
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Assignee</strong> set to <i>matz (Yukihiro Matsumoto)</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=9674
2010-04-02T08:15:10Z
znz (Kazuhiro NISHIYAMA)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Assigned</i></li><li><strong>Target version</strong> set to <i>2.0.0</i></li><li><strong>Start date</strong> set to <i>02/26/2009</i></li></ul><p>=begin</p>
<p>=end</p>
Ruby master - Feature #1211: nested loop construct
https://bugs.ruby-lang.org/issues/1211?journal_id=23600
2012-02-08T03:29:58Z
kosaki (Motohiro KOSAKI)
kosaki.motohiro@gmail.com
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Rejected</i></li></ul><p>三年前の高速化ネタを蒸し返すのも不毛なのでCloseしますね。たぶん今計り直すと全然違う結果が得られる気がするので新チケットで最初から議論しなおしたほうがマシでしょう</p>