------art_8280_3446189.1159114147674
Content-Type: multipart/alternative; 
	boundary---art_8281_5164411.1159114147674"

------art_8281_5164411.1159114147674
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On 9/24/06, Nobuyoshi Nakada <nobu / ruby-lang.org> wrote:
>
> Hi,
>
> At Sun, 24 Sep 2006 11:52:27 +0900,
> Devin Mullins wrote in [ruby-talk:216068]:
> >
> > Bob Hutchison wrote:
> > > A short article describing a problem in the implementation of array
> > > shift in Ruby 1.8.4 with a simple one-line fix in the C code is here:
> > That's half a fix. If you're using shift and push to manage a queue, you
> > still have an ever-growing buffer.*
>
> Does this patch fix it?
>
>
> Index: array.c
> > RCS file: /cvs/ruby/src/ruby/array.c,v


Nobu,

This was one of the issues I was addressing in a patch I made a year ago:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/5861

In addition to this memory issue with element sharing, I also made
performance for operating at either end of the array symmetrical (i.e.
shift/unshift same performance as pop/push).  From my testing of perl, it
has this now.

Would you mind running the benchmark I have attached?  It has cases with
run-time and memory performance issues (but this benchmark is only measuring
run-time).  You may need to delete some of the tests that use a count with
shift/pop.  The 1.9 a year ago that I was patching against could take a
count for shift and pop.  I'm not sure if the current 1.9 still does or
not.  This benchmark takes one argument - the binary power for the number of
elements/iterations (15 : 2**15 elements/iterations).

Here were the improvements I had with my patch.  Many went from O(n) to
O(1).

n  2768 (2**15)


code                        old   new
------------------------- ----- -----
;                          0.01  0.01
shift                      0.02  0.02
shift(1)                   0.03  0.04
pop                        0.02  0.01
pop(1)                     0.04  0.05
shift;pop                  0.02  0.02
shift(1);pop(1)            0.07  0.08
unshift(i)                 2.34  0.02
push(i)                    0.02  0.02
unshift(i);push(i)         2.35  0.03
unshift(shift)            17.61  0.03
unshift(*shift(1))        17.42  0.07
push(pop)                  0.04  0.02
push(*pop(1))             13.83  0.08
push(shift)               14.64  0.03
push(*shift(1))           15.39  0.08
unshift(pop)               2.33  0.03
unshift(*pop(1))          16.47  0.08
slice!(1)                  2.29  0.03
delete_at(1)               2.30  0.02
slice!(1,1)               12.75  0.05
self[1,1]               2.36  0.05
slice!(-2)                 0.02  0.03
delete_at(-2)              0.02  0.02
slice!(-2,1)              10.37  0.05
self[-2,1]              0.04  0.04
self[1,0]]              3.49  0.04
insert(1,i)                3.44  0.04
self[-1,0]]             1.07  0.05
insert(-2,i)               1.02  0.05
self[1,0]ice!(1,1)     16.40  0.06
insert(1,delete_at(1))     5.60  0.06
self[-1,0]ice!(-2,1)   11.92  0.06
insert(-2,delete_at(-2))   1.00  0.06
self[-1,0]ice!(1,1)    14.10  0.07
insert(-2,delete_at(1))    3.29  0.06
self[1,0]ice!(-2,1)    14.06  0.07
insert(1,delete_at(-2))    3.30  0.06
self[i]ロン            ーョーウ  ーョーイ
ロンゥ              ーョーウ  ーョーイ
ロャアンロャアン       アアョキイ  ーョーカ
ロュュアンロュュアン      ーョーオ  ーョーオ
ロュュアンュュアゥ        ーョーエ  ーョーオ
ロュュアャアンロュュアャアン アアョキエ  ーョーキ
ロュュアンロン         ーョーウ  ーョーウ
ロュュアンゥ           ーョーウ  ーョーエ
ロュュアャアンロャアン    アアョカキ  ーョーキ
ロンロュュアン         ーョーエ  ーョーエ
ロンュュアゥ           ーョーウ  ーョーウ
ロャアンロュュアャアン    アアョキー  ーョーカ

ュュュュュュ゜クイクア゜オアカエエアアョアアオケアアエアエキカキエ
テュヤコ ッサ スノモマュククオケュア
テュヤュナコ キ
テュトコ 

マ ケッイエッーカャ シ ゜「セホ ホシッセ ヲサシ コタュョ「セタュョシッセヲサ コシセシ ゜「セシッセシ ゜「 ュコ ア  ィイーエャ イーエャ イーエゥサ コ ー ー ー ーョクサ ュコ アサ「セ
ネャシセシセチ モャ イエ モ イーーカ アアコオイコイキ ォーケーーャシセト ヘ   ロュコイアカーカクンコシセヲサシセヲサ ツ ネ コシセヲサ ヲサ チ          シセヲサ ヲサ   メ 
アョクョエ    ュ    テ   コシセヲサ ヤァ   ョ ノ ァ        ャ シセヲサ    ュ ョェシセシセト    ソシセシセシセ
ノコ ョシセセメテモ コ ッッッッッョャシッセシセシセ
ホャシセ
シセ
ヤ      ノ      ノ    コシセ
シセ
シ コッッョョョッュッョッッュッオクカア「セコッッョョョッュッョッッュッオクカアシッセシセ
シセ
ノ        ャ ノ  
          ィョョ
ッ    ッゥョヲサ ニ   
ャ    ョヲサ シセ
シッセシッセシセ
ラ      ノ  ソヲサ ノ 
  ュ     ィ  
   ュゥョヲサ ル       
      ッョヲサ ヤ アョケ     ノ
          ョヲサ ノァ
     アョケ    ョヲサ ヤ 
   ュ       
ッ ィアオ コ イェェアオ ッゥョシセ
シセ
ネ    ノ    ョヲサ ヘ   マィゥ  マィアゥョシセ
シ ont-family: monospace;"><br>
</span>n  2768 (2**15)<br>
<pre><tt><br>code                        old   new<br>------------------------- ----- -----<br>;                          0.01  0.01<br>shift                      0.02  0.02<br>shift(1)                   0.03  0.04<br>pop                        
0.02  0.01<br>pop(1)                     0.04  0.05<br>shift;pop                  0.02  0.02<br>shift(1);pop(1)            0.07  0.08<br>unshift(i)                 2.34  0.02<br>push(i)                    0.02  0.02<br>unshift(i);push(i)         
2.35  0.03<br>unshift(shift)            17.61  0.03<br>unshift(*shift(1))        17.42  0.07<br>push(pop)                  0.04  0.02<br>push(*pop(1))             13.83  0.08<br>push(shift)               14.64  0.03<br>push(*shift(1))           
15.39  0.08<br>unshift(pop)               2.33  0.03<br>unshift(*pop(1))          16.47  0.08<br>slice!(1)                  2.29  0.03<br>delete_at(1)               2.30  0.02<br>slice!(1,1)               12.75  0.05<br>self[1,1]               
2.36  0.05<br>slice!(-2)                 0.02  0.03<br>delete_at(-2)              0.02  0.02<br>slice!(-2,1)              10.37  0.05<br>self[-2,1]              0.04  0.04<br>self[1,0]]              3.49  0.04<br>insert(1,i)                
3.44  0.04<br>self[-1,0]]             1.07  0.05<br>insert(-2,i)               1.02  0.05<br>self[1,0]ice!(1,1)     16.40  0.06<br>insert(1,delete_at(1))     5.60  0.06<br>self[-1,0]ice!(-2,1)   11.92  0.06<br>insert(-2,delete_at(-2))   
1.00  0.06<br>self[-1,0]ice!(1,1)    14.10  0.07<br>insert(-2,delete_at(1))    3.29  0.06<br>self[1,0]ice!(-2,1)    14.06  0.07<br>insert(1,delete_at(-2))    3.30  0.06<br>self[i]ロン            ーョーウ  ーョーイシセロンゥ              
ーョーウ  ーョーイシセロャアンロャアン       アアョキイ  ーョーカシセロュュアンロュュアン      ーョーオ  ーョーオシセロュュアンュュアゥ        ーョーエ  ーョーオシセロュュアャアンロュュアャアン アアョキエ  ーョーキシセロュュアンロン         ーョーウ  ーョーウシセロュュアンゥ           
ーョーウ  ーョーエシセロュュアャアンロャアン    アアョカキ  ーョーキシセロンロュュアン         ーョーエ  ーョーエシセロンュュアゥ           ーョーウ  ーョーウシセロャアンロュュアャアン    アアョキー  ーョーカシセシセシセシッセシセシッセ

ュュュュュュ゜クイクア゜オアカエエアアョアアオケアアエアエキカキエュュ

ュュュュュュ゜クイクー゜ウエエカアクケョアアオケアアエアエキカキエ
テュヤコ ッュサ ス゜ョ
テュヤュナコ カエ
リュチュノコ ゜ア
テュトコ サ ス「゜ョ「

テハリヨユハイハホラニヒテホーノヌレニノヌホレヌユレララヨテアウホメイエヒ
テメウメノトーハリキテノテチヘモチノトノテチノテチノテチノテチノテチノテチノテチノテチノテチノテチム
ノテチノテチノチフユヘテエアノネホラレーノテチノテチノテチノテチノテチノテチノテチノテチノテチモテナホモチ
フユイレムヘモノテチノテチノテチノテチノテチノテチノテチノテツヒイエヒヘモエアノトチホモツウチノテチノテチ
ノテチノテチノテチノテチノテチノテチノテチノヌヒヘモエアノトチホモツウチヘモノテチノテチノテチノテチノテチノテチ
ノテチノテチノヌヒヘチノトチノテツヌトウチノテチノテチノテチノテチノテチノテチノテチノヌオチノテチ
ヘテチノネホラレーヒトナマウツテヒモチノテチノテチノテチノテチノテチテチノテチノテチテチホモチフユ
ラオヌテヒモチノテチノテチノテチノテチノテチノテチノテチヤエケハフラエネーフラテチ
ホモチフユネヨテヒモチノテチノテチノテチノテチノテチノテチノテチノテチヤエケクヒモルヒヌクヒリク
ムノテチヘチノネヨイレムモキネヨテヒモチノテチノテチノテチノテチヒヌォミラエハルモアヒリク
ヒヌエヘモアヒムノテチノテチノチノテチヘモチノネヨイレムイレムノテチノテチノテチノテチノテチノテチ
ムノテチヘモチノネヨイレムヒホラレーヒトナヒモチノテチノテチノテチノテチムノテチヘモチノネツアイ
ヌケヒモチノテチノテチノテチノテチノテチノテチノテチムノテチヘモチノネツアイヒツテヒモノテチノテチ
ノテチノテチノテチノテチムノテチヘモチノネツアイイレムノテチノテチノテチノテチノテチノテチノテチム
ノテチヘモチノネツアイヒホラレーヒトナヒモチノテチノテチノテチノテチノテチムノテチヘモチノネヨイレム
ヌケヒモチノテチノテチノテチノテチノテチノテチムノテチヘモチノネヨイレムヒツテヒモノテチノテチ
ノテチノテチノテチムノテチノテチノチフユヘテエアノネホラホノモヒモチノテチノテチノテチノテチノテチノテチ
ノテチヒヌクヘモハクテヒイエテナホモチフユレヌヨレリメリイニーヒトナノテチノテチノテチノテチノテチノテチ
ノテチヤヒモルリクヒヌヒヘモエアノトチホモツヌレモナヘモヒモチノテチノテチノテチノテチノテチノテチ
ノテミトナハレネモヒムフユヘテエアノネホヌレヘモリヤアリモチノテチノテチノテチノテチノテチノテチ
ヒヌクヘモハクテヒイエテナホモチフユイルイユヒテーヒモチノテチノテチノテチノテチノテチノテチノテチ
ヤオフノヘハヒイエネテナホモチフユレヌヨレリメリイニーヒテーヒモチノテチノテチノテチノテチノテチ
ノテチヤオフノヘハヒイエネテナホモチフユイルイユヒテーフトナノテチノテチノテチノテチノテチ
ノテチノテチヤオフノヘハヒイエネテナホモチフユイヨレヘリヤアリモチノテチノテチノテチ
ノテチノテチノテチヤオフノヘハヒイエネテチノテチノテチテチホモチフユイヨレフトツミヨ
リモチノテチノテチノテチノテチノテチノテツミラエヤヒモルヒヌクテミアヒモルリクフユ
ヘモエアノヌイヨテフヌノテチノテチノテチノテチノテチノテチノテチアフラキヒヌクヘテハフラエネ
エケハクヌヒヘテエアノトナホモツレララーフトツミヨリモチノテチノテチノテチノテチノテチノヌケモア
フノヘヤヒモルリクヒヌォミラエハルモアヒリクフユヘモエアノヌイヨテヘヒモチノテチ
ノテチノテチノテチノテチノテチアフラエヘマミトチハレネエケハフラエネテノテチ
ヘモチノネホヌレヘモリヤアヌレモナヘモヒモチノテチノテチノテチムノテチヘモチノヌイヨテフヌメ
ヌヨーレヨケテヒモノテチノテチノテチムノテチヘモチノネホヌレフヤナヘニーケイルイユヒテーフトナノテチ
ノテチノテチムノテチヘモチノヌイヨテヘレラヌヨルリムフヤノヒモチノテチノテチムヒヘモチノトナ
ノテツレララーフトツミリホラホノモフトナノテチノテチノテチノテヤヒリクヒヌォミラエヘモハレネ
ヒヌヘモヒヌエヘヘモヒヘモチノトナノテツホムフヤノレヌヨレリメリイニーヒトナヒモチノテチノテチノテ
ヤヒリクヒヌォミラエヘモハレネヒヌヘモヒヌエヘヘモヒヘモチノトナノテツレララナヘニーケイ
ルイユヒテーフトナノテチノテチノテチノテヤヒリクヒヌォミラエヘモハレネヒヌヘヒヌエヘヘモヒ
ヘモチノトナノテツホムヘモレラヌヨルリムフヤノヒモチノテチノテチノテヤヒリクヒヌォミラエヘモ
ハレネヒヌヘヒヌエヘヘモヒテナノテチノテチイヨレリヤアレラライノテチノテチノテチノテチ
ノテチノテツテナノテチノテチイヨレリヤアテヒモチノテチノテチノテチノテチノテチノテツテナノテチノテチ
イヨレフトニミリホヌレモリモチノテチノテチノテチノテツテナノテチノテチイヨレモーリヤアレラ
ラアフヤニノテチノテチノテチノテツテナノテチノテチイヨレモーリヤアテモーヒモチノテチノテチノテチ
ノテツテナノテチノテチイヨレモーフトニミリホヌレフラヘモリモチノテチノテツテナノテチノテチイヨ
レモーリヤアレラライノテチノテチノテチノテチノテチヤエケクヒモルヒヌエヘモアヒリクムノテチヘモチ
ノネホヌレフラヘヨーケルリムモノテチノテチノテチノテチノテチヒヌォミラエヘハフヤナモクヌヒヘモチ
ノトナノテツレララアフヤナヘヨーケイヨレフトニノテチノテチノテチノテミアフノハルーフラネ
テナノテチノテチイヨレリヤアレララアフヤニノテチノテチノテチノテチノテチヤエケクヒモルリクヒヌエ
ヘモアヒムノテチヘモチノネホヌレヨーケルリムフラヘモノテチノテチノテチノテチノテチヒヌォミラエヘハク
テフヤナモヒヘモチノトナノテツレラライヘヨーケイヨレモーフトニノテチノテチノテチノテミアフノ
ハレネーフラテケテヌラヨレネヘミモチーテツユラフハヌルイユラナリモラルムヨハネヨオ
リツーヤクヒテニモメアルレラニテツキノネネツクテチノテツノトーヘモチクミテツネチヌケムノテチネヨー
ノテチネヨーチケノテホキーヒムノテチルラエミモチヘテエフノトクノトナヒモオーアケテチノテチヒノテチ
ノネハウヨネヘミモツノルリホフオヒノテチノナハホラニオラハノネヌハホラニウヒノテチ
ノテチノテツメモチケノトチノテチヒノテチノテチノテツウヌレモツメヤーレリホーオリテチノテチノテチ
ノテチノヌリムレルラルイケレモウホムミモツーレリホーアメモヌラヨレネホテチノテチノテチ
ノテチノテホリメヒヌホレヌユテチノテチノテチノテチノヌリムミモツーフメリイルヒノテチノテチノテチノテチ
レルラミモツラオテオーアケテチノテチノテチノテチノヌリムレルラケミヤノウノニイユラオ
テオーアケヒノノラオテオーアケヒノミヤノヒヤヒノテチノテチノテチノテチヨラーアメモケヌ
ラヨレネホノトーレルラケミヤチミツリモチカテチノテチノテチノテチノテチノテツニヒテハツハモオレリ
ノウラオテヌケリーノネクリヒノテチノテチノテチノテチノテチノテチノテチイニイヨネーヒノテチ
ノテチノテチノテチノテチノネーヒムノテチノテチノテチノテツレラオヌアヨウハーヒヌホレヌユハヨイルラ
ノラハルモツキテチノテチノテチノテチノテチノテツノトールラオヘテヒリムフメリイケリムノテチ
ノテチノテチノテチノテチルモオホールラオレヨケニノネイオケフメラヨツクリヒノテチノテチノテチノテチ
ノテチノテチノテチイホレヌヨケテチノテチノテチノテチノテチノテツケムノテチノテチノテチノテチノテチヨラー
ノトーヨラーアイヨネハオフーレレラウアテチノテチノテチノテチノテチノテツミヤアレリホアネムウノ
ニイユルモオホレラホーヒミモヨラーフウツルウムテチノテチノテチノテチノネーヒモヒノテチ
ノテチノテチノテチレラオーヒーメヌメテチノテチノテチレラオテチノテツケテーヒテュュュュュュ゜クイクー゜ウエエカアクケョアアオケアアエアエキカキエュュ