[#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:34163] Array#shift/unshift の高速化
ワナベと申します。
[ruby-core:5861]のパッチに興味があったので、
RARRAY_PTR(ary) より前方に空きメモリを保持するようにする、というアイディアを真似して
shift/unshift の高速化をするパッチを書いてみました。
長くなりそうだったので rb_ary_splice には触っていません。
元のパッチと比較すると、短いのでチェック・テストはしやすくなっていると思います。
とりあえず test_array.rb は通ることを確認しました。
Index: array.c
===================================================================
--- array.c (revision 15844)
+++ array.c (working copy)
@@ -20,6 +20,7 @@
static ID id_cmp;
#define ARY_DEFAULT_SIZE 16
+#define ARY_DEFAULT_LCAPA 4
void
rb_mem_clear(register VALUE *mem, register long size)
@@ -45,9 +46,21 @@
#define ARY_CAPA(ary) RARRAY(ary)->aux.capa
#define RESIZE_CAPA(ary,capacity) do {\
- REALLOC_N(RARRAY(ary)->ptr, VALUE, (capacity));\
+ RARRAY(ary)->ptr -= RARRAY(ary)->lcapa;\
+ REALLOC_N(RARRAY(ary)->ptr, VALUE, (capacity) + RARRAY(ary)->lcapa);\
+ RARRAY(ary)->ptr += RARRAY(ary)->lcapa;\
RARRAY(ary)->aux.capa = (capacity);\
} while (0)
+#define RESIZE_LCAPA(ary,lcapacity) do {\
+ long offset = (lcapacity) - RARRAY(ary)->lcapa;\
+ if((lcapacity) < 0 || offset > RARRAY(ary)->aux.capa - RARRAY_LEN(ary)) {\
+ rb_raise(rb_eIndexError, "[BUG] invalid left-capacity");\
+ }\
+ RARRAY_PTR(ary) += offset;\
+ MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary) - offset, VALUE,
RARRAY_LEN(ary));\
+ RARRAY(ary)->aux.capa -= offset;\
+ RARRAY(ary)->lcapa = (lcapacity);\
+} while (0)
static inline void
rb_ary_modify_check(VALUE ary)
@@ -67,6 +80,7 @@
ptr = ALLOC_N(VALUE, RARRAY_LEN(ary));
FL_UNSET(ary, ELTS_SHARED);
RARRAY(ary)->aux.capa = RARRAY_LEN(ary);
+ RARRAY(ary)->lcapa = 0;
MEMCPY(ptr, RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary));
RARRAY(ary)->ptr = ptr;
}
@@ -102,6 +116,7 @@
ary->len = 0;
ary->ptr = 0;
ary->aux.capa = 0;
+ ary->lcapa = 0;
return (VALUE)ary;
}
@@ -121,6 +136,7 @@
if (len == 0) len++;
RARRAY(ary)->ptr = ALLOC_N(VALUE, len);
RARRAY(ary)->aux.capa = len;
+ RARRAY(ary)->lcapa = 0;
return ary;
}
@@ -135,7 +151,11 @@
VALUE
rb_ary_new(void)
{
- return rb_ary_new2(ARY_DEFAULT_SIZE);
+ VALUE ary = rb_ary_new2(ARY_DEFAULT_SIZE + ARY_DEFAULT_LCAPA);
+ RARRAY(ary)->ptr += ARY_DEFAULT_LCAPA;
+ RARRAY(ary)->lcapa = ARY_DEFAULT_LCAPA;
+ RARRAY(ary)->aux.capa = ARY_DEFAULT_SIZE;
+ return ary;
}
#include <stdarg.h>
@@ -177,7 +197,7 @@
rb_ary_free(VALUE ary)
{
if (!ARY_SHARED_P(ary)) {
- xfree(RARRAY(ary)->ptr);
+ xfree(RARRAY(ary)->ptr - RARRAY(ary)->lcapa);
}
}
@@ -194,6 +214,7 @@
shared->len = RARRAY(ary)->len;
shared->ptr = RARRAY(ary)->ptr;
shared->aux.capa = RARRAY(ary)->aux.capa;
+ shared->lcapa = RARRAY(ary)->lcapa;
RARRAY(ary)->aux.shared = (VALUE)shared;
FL_SET(ary, ELTS_SHARED);
OBJ_FREEZE(shared);
@@ -292,7 +313,7 @@
rb_ary_modify(ary);
if (argc == 0) {
if (RARRAY_PTR(ary) && !ARY_SHARED_P(ary)) {
- free(RARRAY(ary)->ptr);
+ free(RARRAY(ary)->ptr - RARRAY(ary)->lcapa);
}
RARRAY(ary)->len = 0;
if (rb_block_given_p()) {
@@ -355,6 +376,7 @@
}
RARRAY(ary)->ptr = ALLOC_N(VALUE, argc);
RARRAY(ary)->aux.capa = argc;
+ RARRAY(ary)->lcapa = 0;
MEMCPY(RARRAY_PTR(ary), argv, VALUE, argc);
RARRAY(ary)->len = argc;
@@ -533,13 +555,11 @@
if (RARRAY_LEN(ary) == 0) return Qnil;
top = RARRAY_PTR(ary)[0];
if (!ARY_SHARED_P(ary)) {
- if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
- MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
- RARRAY(ary)->len--;
- return top;
+ if (RARRAY_LEN(ary) * 2 < RARRAY(ary)->lcapa) {
+ RESIZE_LCAPA(ary, RARRAY_LEN(ary));
}
- RARRAY_PTR(ary)[0] = Qnil;
- ary_make_shared(ary);
+ RARRAY(ary)->lcapa++;
+ RARRAY(ary)->aux.capa--;
}
RARRAY(ary)->ptr++; /* shift ptr */
RARRAY(ary)->len--;
@@ -577,14 +597,12 @@
rb_ary_modify_check(ary);
result = ary_shared_first(argc, argv, ary, Qfalse);
n = RARRAY_LEN(result);
- if (ARY_SHARED_P(ary)) {
- RARRAY(ary)->ptr += n;
- RARRAY(ary)->len -= n;
- }
- else {
- MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
- RARRAY(ary)->len -= n;
+ if (!ARY_SHARED_P(ary)) {
+ RARRAY(ary)->lcapa += n;
+ RARRAY(ary)->aux.capa -= n;
}
+ RARRAY(ary)->ptr += n;
+ RARRAY(ary)->len -= n;
return result;
}
@@ -608,12 +626,18 @@
if (argc == 0) return ary;
rb_ary_modify(ary);
- if (RARRAY(ary)->aux.capa <= (len = RARRAY(ary)->len) + argc) {
- RESIZE_CAPA(ary, len + argc + ARY_DEFAULT_SIZE);
+ if (RARRAY(ary)->lcapa < argc) {
+ long add_capa = ARY_DEFAULT_SIZE;
+ long add_lcapa = ARY_DEFAULT_LCAPA;
+ if (RARRAY(ary)->aux.capa <= (len = RARRAY(ary)->len) + argc + add_lcapa) {
+ RESIZE_CAPA(ary, len + argc + add_capa + add_lcapa);
+ }
+ RESIZE_LCAPA(ary, RARRAY(ary)->lcapa + argc + add_lcapa);
}
- /* sliding items */
- MEMMOVE(RARRAY(ary)->ptr + argc, RARRAY(ary)->ptr, VALUE, len);
+ RARRAY(ary)->ptr -= argc;
+ RARRAY(ary)->lcapa -= argc;
+ RARRAY(ary)->aux.capa += argc;
MEMCPY(RARRAY(ary)->ptr, argv, VALUE, argc);
RARRAY(ary)->len += argc;
@@ -1494,6 +1518,7 @@
RARRAY(ary)->ptr = RARRAY(tmp)->ptr;
RARRAY(ary)->len = RARRAY(tmp)->len;
RARRAY(ary)->aux.capa = RARRAY(tmp)->aux.capa;
+ RARRAY(ary)->lcapa = RARRAY(tmp)->lcapa;
FL_UNSET(ary, ELTS_SHARED);
rb_gc_force_recycle(tmp);
}
@@ -2019,7 +2044,7 @@
if (copy == orig) return copy;
shared = ary_make_shared(orig);
if (!ARY_SHARED_P(copy)) {
- ptr = RARRAY(copy)->ptr;
+ ptr = RARRAY(copy)->ptr - RARRAY(copy)->lcapa;
xfree(ptr);
}
RARRAY(copy)->ptr = RARRAY(orig)->ptr;
Index: include/ruby/ruby.h
===================================================================
--- include/ruby/ruby.h (revision 15844)
+++ include/ruby/ruby.h (working copy)
@@ -498,6 +498,7 @@
VALUE shared;
} aux;
VALUE *ptr;
+ long lcapa;
};
#define RARRAY_LEN(a) RARRAY(a)->len
#define RARRAY_PTR(a) RARRAY(a)->ptr
--
ワナベ