[#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 <4A9E44DD.6050706@airemix.jp>,
成瀬です。
小崎@思いつきを適当に書いてみるテスト
In article <20090907091830.2C7A.A69D9226@jp.fujitsu.com>,
> In article <20090907091830.2C7A.A69D9226@jp.fujitsu.com>,
2009/09/07 14:38, Tanaka Akira wrote:
In article <4AA5EA67.1040504@airemix.jp>,
[#38007] [Feature #1159] StringScanner に文字ベースでのインデックスを返すメソッドがほしい — Akira Matsuda <redmine@...>
Feature #1159: StringScanner に文字ベースでのインデックスを返すメソッドがほしい
[#38018] circular require in openssl — Tanaka Akira <akr@...>
以下のように、openssl には環状の require があり、警告が出ます。
In article <87vdrcul7y.fsf@fsij.org>,
まつもと ゆきひろです
In article <E1LYyoE-0005P0-Hi@x61.netlab.jp>,
[#38022] ENCODING_FIXED と ENCODING_NONE の廃止 — "NARUSE, Yui" <naruse@...>
成瀬です。
In article <49986A0A.5060602@airemix.jp>,
成瀬です。
In article <49995412.6040000@airemix.jp>,
[#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 と申します。
前田です。
まつもと ゆきひろです
前田です。
In article <704d5db90907141754p285e6e51xdd3208b27d556906@mail.gmail.com>,
[#38098] ブロック引数と括弧・引数なしsuper — Shugo Maeda <shugo@...>
前田です。
まつもと ゆきひろです
[ruby-dev:37908] Re: 配列の重複検出用Hashの使いまわし
ワナベです。
2009/02/04 14:45 wanabe <s.wanabe@gmail.com>:
> 2009/02/04 13:34 Tanaka Akira <akr@fsij.org>:
>> In article <8964790c0902032007n708f1587je29b391281bf5932@mail.gmail.com>,
>> wanabe <s.wanabe@gmail.com> 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;
}
--
ワナベ