[#33948] Schedule for the 1.8.7 release — "Akinori MUSHA" <knu@...>
Hi, developers,
[#33955] --encoding affects script encoding — sheepman <sheepman@...>
こんばんは sheepman です。
なかだです。
[#33962] Ruby1.9.0でのインタプリタ組み込みについての質問 — Masayuki Yamaguchi <Yamaguchi.Masayuki@...>
山口と申します。
[#33966] Re: [ruby-cvs:22881] Ruby:r15644 (trunk): * test/ruby/test_m17n_comb.rb (TestM17NComb::test_str_chomp): test — Tanaka Akira <akr@...>
In article <200802291457.m1TEv6nh008515@ci.ruby-lang.org>,
まつもと ゆきひろです
[#33974] Test::Unit::Collector::Dirがtest_*.rb以外集めてくれない — "Ken Date" <itacchi@...>
こんにちは、伊達です。
[#33983] Re: [ruby-cvs:22913] Re: Ruby:r15674 (trunk): * gc.c (add_heap): sort heaps array in ascending order to use — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
In article <E1JWAV5-0001MG-9W@x61.netlab.jp>,
[#34011] Should --verbose be equal to -v ? — Yugui <yugui@...>
Yuguiです。
まつもと ゆきひろです
西山和広です。
Yuguiです。
[#34020] MurmurHash problem — Nobuyoshi Nakada <nobu@...>
なかだです。
[#34030] uint32_t — KIMURA Koichi <kimura.koichi@...>
木村です。
[#34037] Ruby performance gains on SPARC — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#34067] Array#take,take_while,drop,drop_whlie — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#34068] lgamma_r requires _REENTRANT on Solaris — "Yusuke ENDOH" <mame@...>
遠藤と申します。
[#34077] 異なるエンコーディングだと同じバイト列でも==にならない件 — rubikitch@...
るびきちです。
[#34086] extend spawn to change attributes of child process. — Tanaka Akira <akr@...>
spaen, system, exec, IO.popen で、起動する子プロセスの属性を
[#34093] 拡張ライブラリ初期化中でのmodule_eval — Kouhei Sutou <kou@...>
須藤です。
[#34095] (再送) Cygwin で Resolv.getaddress が失敗する — Kouhei Yanagita <yanagi@...>
こんにちは。柳田です。
こんばんは、植田と申します。
柳田です。
[#34105] rational.rb, complex.rb and mathn.rb — Tadayoshi Funaba <tadf@...>
rational と complex が組み込みになったことで、lib/mathn.rb の意義は薄
現時点で rational.rb と complex.rb を残しているのは、それが無難だから
で、かなり選択肢を絞った叩き台です。
けいじゅ@いしつかです.
原です。
> 私も Complex の組み込みは Rational とは比較にならないくらい、仕様が決め
まつもと ゆきひろです
> Mathモジュールは伝統的にlibmのラッパーであったので、それを逸
原です。
> (1) (-8)**Rational(1,2) は複素数1.0+1.7320508*i
[#34109] LP64: date.rb:321:in `convert': integer 86400000000000 too big to convert to `int' (RangeError) — Tanaka Akira <akr@...>
LP64 なマシンで test-all が動かなくなっています。
[#34144] [質問2点] C からの定数参照 & thread switching コストの低減 — Hidetoshi NAGAI <nagai@...>
永井@知能.九工大です.
[#34158] Complex組み込み — Masahiro TANAKA <masa16.tanaka@...>
Complexが組み込みになるそうですが、これはcomplex.rbを踏襲して、
原です。
> 今までの Complex は、complex.rb にほぼ残して、たとえば Rational 成分
原です。
> そうです。Complex が難しい、という話を書いておくと、
まつもと ゆきひろです
> |僕としては、/ 演算子の振舞いについて前向きに検討してほしいです。
まつもと ゆきひろです
> ふむ。では、/ のふるまいを
まつもと ゆきひろです
> |僕は、quo がいいと思います。
まつもと ゆきひろです
> となるようですが、別の実装として、
田中です。
> 最初に言っておきますが、気を悪くされたのならすみません。
村田です.
[#34159] ruby-trunk Marshal.dump bug — nagachika <rucila@...>
nagachika と申します。
[#34163] Array#shift/unshift の高速化 — wanabe <s.wanabe@...>
ワナベと申します。
[#34189] Re: [ruby-cvs:23106] Re: Ruby:r15866 (trunk): * numeric.c (num_quo): should convert its operand to Rational. — Tadayoshi Funaba <tadf@...>
間違って送ったので、再送。
> > > Log:
[ruby-dev:34005] Array#slice! may be too slow and allocate memory too much
遠藤と申します。
以下のプログラムがやたら遅いです。また、メモリを大量に消費します。
$ time ./ruby -ve '
> a = [0] * 10000
> (1 .. 10000).map { a.slice!(0, 1) }
> '
ruby 1.9.0 (2008-03-07 revision 15720) [i686-linux]
real 0m10.940s
user 0m4.200s
sys 0m6.710s
配列の共有が原因のようです。a.slice!(i, n) は Ruby で書くと
t = a[i, n]
a[i, n] = []
return t
という風に実装されていて、
1. t = a[i, n] が a と t を共有状態にする
2. a[i, n] = [] が a を rb_ary_modify する
3. rb_ary_modify の中で a 全体を MEMCPY する
という風に実行されます。これによって、
- 3 の MEMCPY が毎回 O(a.size) まるまるかかって遅い
- t が a.size バイトを無駄に確保したままになり (n で十分) 、メモリを圧迫する
というようになっています。
本質的な解決ではないですが、slice! に特化した 2 つの最適化をしてみました。
- rb_ary_splice で rb_ary_modify するとき、必要なところだけ MEMCPY する
- a.slice!(i, n) で n が a.size / 2 より小さい場合は t を共有せずに作る
ベンチマークです。単位は秒。
+----------+-------------+-----------------------------------------------+
| 最適化前 | 最適化後 | |
| user sys | user sys | a = [0] * 10000; b = (1 .. 10000).map { ... } |
+----------+-------------+-----------------------------------------------+
| 4.2 6.7 | 0.14 0.03 | a.slice!(0, 1) |
| 0.26 6.6 | 0.050 0.030 | t, a = a, a.slice!(0, a.size - 1); t |
+----------+-------------+-----------------------------------------------+
なお、この最適化を入れても、以下のコードではやっぱり遅いです。
これを何とかするのはいろいろと面倒そうです。
a = [0] * 10000
(1 .. 10000).map { t = a[0, 1]; a[0, 1] = []; t }
Index: array.c
===================================================================
--- array.c (revision 15726)
+++ array.c (working copy)
@@ -647,6 +647,26 @@
}
VALUE
+rb_ary_subseq_copy(VALUE ary, long beg, long len)
+{
+ VALUE klass, ary2;
+
+ if (beg > RARRAY_LEN(ary)) return Qnil;
+ if (beg < 0 || len < 0) return Qnil;
+
+ if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) {
+ len = RARRAY_LEN(ary) - beg;
+ }
+ klass = rb_obj_class(ary);
+ ary2 = ary_new(klass, len);
+ if (len > 0) {
+ MEMCPY(RARRAY_PTR(ary2), RARRAY_PTR(ary) + beg, VALUE, len);
+ RARRAY(ary2)->len = len;
+ }
+ return ary2;
+}
+
+VALUE
rb_ary_subseq(VALUE ary, long beg, long len)
{
VALUE klass, ary2, shared;
@@ -973,8 +993,8 @@
rpl = rb_ary_to_ary(rpl);
rlen = RARRAY_LEN(rpl);
}
- rb_ary_modify(ary);
if (beg >= RARRAY_LEN(ary)) {
+ rb_ary_modify(ary);
len = beg + rlen;
if (len >= ARY_CAPA(ary)) {
RESIZE_CAPA(ary, len);
@@ -993,15 +1013,30 @@
}
alen = RARRAY_LEN(ary) + rlen - len;
- if (alen >= ARY_CAPA(ary)) {
- RESIZE_CAPA(ary, alen);
+
+ rb_ary_modify_check(ary);
+ if (ARY_SHARED_P(ary)) {
+ VALUE *ptr;
+ ptr = ALLOC_N(VALUE, alen);
+ FL_UNSET(ary, ELTS_SHARED);
+ MEMCPY(ptr, RARRAY_PTR(ary), VALUE, beg);
+ MEMCPY(ptr + beg + rlen, RARRAY_PTR(ary) + beg + len,
+ VALUE, RARRAY_LEN(ary) - (beg + len));
+ RARRAY(ary)->aux.capa = RARRAY(ary)->len = alen;
+ RARRAY(ary)->ptr = ptr;
}
+ else {
+ if (alen >= ARY_CAPA(ary)) {
+ RESIZE_CAPA(ary, alen);
+ }
+ if (len != rlen) {
+ MEMMOVE(RARRAY_PTR(ary) + beg + rlen,
+ RARRAY_PTR(ary) + beg + len,
+ VALUE, RARRAY_LEN(ary) - (beg + len));
+ RARRAY(ary)->len = alen;
+ }
+ }
- if (len != rlen) {
- MEMMOVE(RARRAY_PTR(ary) + beg + rlen, RARRAY_PTR(ary) + beg + len,
- VALUE, RARRAY_LEN(ary) - (beg + len));
- RARRAY(ary)->len = alen;
- }
if (rlen > 0) {
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
}
@@ -1790,7 +1825,12 @@
pos = RARRAY_LEN(ary) + pos;
if (pos < 0) return Qnil;
}
- arg2 = rb_ary_subseq(ary, pos, len);
+ if (len * 2 < RARRAY_LEN(ary)) {
+ arg2 = rb_ary_subseq_copy(ary, pos, len);
+ }
+ else {
+ arg2 = rb_ary_subseq(ary, pos, len);
+ }
rb_ary_splice(ary, pos, len, Qundef); /* Qnil/rb_ary_new2(0) */
return arg2;
}
--
Yusuke ENDOH <mame@tsg.ne.jp>