[#37892] 配列の重複検出用Hashの使いまわし — wanabe <s.wanabe@...>
ワナベと申します。
[#37898] [Bug #1105] Ruby1.9でのrescue節の例外ハンドラのマッチの処理 — Tatsuji Kawai <redmine@...>
Bug #1105: Ruby1.9でのrescue節の例外ハンドラのマッチの処理
[#37910] [Bug:1.9] lack consistency in hash iteration — Yusuke ENDOH <mame@...>
遠藤です。
まつもと ゆきひろです
[#37918] [BUG: 1.9] encoding warning — SASADA Koichi <ko1@...>
ささだです.
[#37921] [Feature:trunk] with_index_from — Yusuke ENDOH <mame@...>
遠藤です。
At Thu, 5 Feb 2009 23:18:49 +0900,
遠藤です。
At Fri, 6 Feb 2009 00:58:59 +0900,
[#37936] zombie processes by drb tests — Tanaka Akira <akr@...>
OpenBSD で、test-all をすると、drb のところで、テストに 100
[#37956] proposal: Module#method_adding — SASADA Koichi <ko1@...>
ささだです.
[#37959] [Bug:trunk] I can modify literals — Yusuke ENDOH <mame@...>
遠藤です。
[#37980] Re: [ruby-changes:10687] Ruby:r22250 (trunk): * iseq.c (simple_default_value): allow plain strings as default — SASADA Koichi <ko1@...>
ささだです.
[#37995] Add POSTARG support to rb_scan_args() — Akinori MUSHA <akinori.musha@...>
rb_scan_args()をPOSTARG対応にするパッチです。
[#37998] [Feature:1.9] {Array,Enumerable}#uniq_by, #uniq_by! — Nobuyoshi Nakada <nobu@...>
なかだです。
[#38005] Is URI.decode() broken? — MOROHASHI Kyosuke <moronatural@...>
もろはしです。いつもお世話になっております。
なかだです。
成瀬です、
xibbarこと藤岡です。
成瀬です。
NARUSE, Yui さんは書きました:
成瀬です。
(2009年03月03日 22:45), NARUSE, Yui さんは書きました:
成瀬です。
In article <[email protected]>,
成瀬です。
小崎@思いつきを適当に書いてみるテスト
In article <[email protected]>,
> In article <[email protected]>,
2009/09/07 14:38, Tanaka Akira wrote:
In article <[email protected]>,
[#38007] [Feature #1159] StringScanner に文字ベースでのインデックスを返すメソッドがほしい — Akira Matsuda <redmine@...>
Feature #1159: StringScanner に文字ベースでのインデックスを返すメソッドがほしい
[#38018] circular require in openssl — Tanaka Akira <akr@...>
以下のように、openssl には環状の require があり、警告が出ます。
In article <[email protected]>,
まつもと ゆきひろです
In article <[email protected]>,
[#38022] ENCODING_FIXED と ENCODING_NONE の廃止 — "NARUSE, Yui" <naruse@...>
成瀬です。
In article <[email protected]>,
成瀬です。
In article <[email protected]>,
[#38048] Add option hash support to rb_scan_args() — "Akinori MUSHA" <knu@...>
rb_scan_args() にoption hash対応を組み込むのはどうでしょうか。
[#38067] Re: [ruby-cvs:29304] Ruby:r22086 (trunk): * ruby.c (process_options): set initial default_external before -r. — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
[#38075] [Bug #1198] corrupted iteratoin during "enum_for :inject" — Shyouhei Urabe <redmine@...>
Bug #1198: corrupted iteratoin during "enum_for :inject"
[#38080] [Feature:trunk] nested loop construct — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
ささだです.
[#38096] 多重代入やメソッド引数の展開でto_aが呼ばれます — nagachika <nagachika00@...>
nagachika と申します。
前田です。
まつもと ゆきひろです
[#38098] ブロック引数と括弧・引数なしsuper — Shugo Maeda <shugo@...>
前田です。
まつもと ゆきひろです
[ruby-dev:37908] Re: 配列の重複検出用Hashの使いまわし
ワナベです。 2009/02/04 14:45 wanabe <[email protected]>: > 2009/02/04 13:34 Tanaka Akira <[email protected]>: >> In article <[email protected]>, >> wanabe <[email protected]> writes: >> >>> ruby-1.9では配列内の重複要素の検出のために >>> 内部でHashオブジェクトが生成されますが、 >>> これをスレッドローカルに保存して使いまわすことで >>> オブジェクト生成とGCの回数を減らすパッチを書きました。 >> >> Hash の操作をすると hash や eql? メソッドを呼びますが、その >> 中でまた重複要素の検出が必要になることはないのでしょうか。 > > ご指摘ありがとうございます。 > 確かにそういったケースでは問題がありました。失礼しました。 > > $ ./ruby -e 'class Foo;def hash;[]|[];return super;end;end;a=[Foo.new, > Foo.new];p a,a|[]' > [#<Foo:0xbfda98>, #<Foo:0xbfda80>] > [] 使用済みHashオブジェクトを配列に保存して そこから使いまわすように書き直しました。 $ ./ruby -e 'class Foo;def hash;[]|[];return super;end;end;a=[Foo.new, Foo.new];p a,a|[]' [#<Foo:0xbff0b8>, #<Foo:0xbff0a0>] [#<Foo:0xbff0b8>, #<Foo:0xbff0a0>] $ ./ruby -Ilib ../bm_array_overlap.rb user system total real & 3.547000 0.032000 3.579000 ( 3.671875) | 5.422000 0.109000 5.531000 ( 6.765625) - 3.468000 0.047000 3.515000 ( 4.312500) --- with thread --- & 18.157000 23.281000 41.438000 ( 52.609375) | 20.546000 22.984000 43.530000 ( 55.109375) - 21.016000 23.969000 44.985000 ( 57.359375) --- GC.disable --- & 3.765000 0.047000 3.812000 ( 4.093750) | 5.641000 0.078000 5.719000 ( 5.828125) - 3.531000 0.078000 3.609000 ( 3.687500) Index: array.c =================================================================== --- array.c (revision 22029) +++ array.c (working copy) @@ -2866,9 +2866,24 @@ static VALUE ary_make_hash(VALUE ary1, VALUE ary2) { - VALUE hash = rb_hash_new(); + VALUE hash; long i; + hash = rb_thread_local_aref(rb_thread_current(), + rb_intern("ary_overlap_check_hash_set")); + if (hash == Qnil) { + rb_thread_local_aset(rb_thread_current(), + rb_intern("ary_overlap_check_hash_set"), + rb_ary_new()); + } else { + hash = rb_ary_pop(hash); + if (hash != Qnil) { + rb_funcall(hash, rb_intern("clear"), 0); + } + } + if (hash == Qnil) { + hash = rb_hash_new(); + } for (i=0; i<RARRAY_LEN(ary1); i++) { rb_hash_aset(hash, RARRAY_PTR(ary1)[i], Qtrue); } @@ -2880,6 +2895,14 @@ return hash; } +static inline void +ary_recycle_hash(VALUE hash) +{ + VALUE list = rb_thread_local_aref(rb_thread_current(), + rb_intern("ary_overlap_check_hash_set")); + rb_ary_push(list, hash); +} + /* * call-seq: * array - other_array -> an_array @@ -2906,6 +2929,7 @@ if (st_lookup(RHASH_TBL(hash), RARRAY_PTR(ary1)[i], 0)) continue; rb_ary_push(ary3, rb_ary_elt(ary1, i)); } + ary_recycle_hash(hash); return ary3; } @@ -2940,6 +2964,7 @@ rb_ary_push(ary3, v); } } + ary_recycle_hash(hash); return ary3; } @@ -2978,6 +3003,7 @@ rb_ary_push(ary3, v); } } + ary_recycle_hash(hash); return ary3; } @@ -3013,6 +3039,7 @@ } } ARY_SET_LEN(ary, j); + ary_recycle_hash(hash); return ary; } -- ワナベ