[#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:34162] GC heap size less patch
authorNariです。
この前に話しにあった、ヒープの細分化のパッチを作りました。
詳細はこちらに書いております。
http://d.hatena.ne.jp/authorNari/20080328/1206675485
もっとベンチマーク用のコードを作って精査する必要がありますが
pre版という事で、よろしくお願いします。
---
id: authorNari
---
Index: gc.c
===================================================================
--- gc.c (リビジョン 15844)
+++ gc.c (作業コピー)
@@ -143,7 +143,6 @@
static RVALUE *freelist = 0;
static RVALUE *deferred_final_list = 0;
-#define HEAPS_INCREMENT 10
static struct heaps_slot {
void *membase;
RVALUE *slot;
@@ -153,9 +152,27 @@
static int heaps_used = 0;
#define HEAP_MIN_SLOTS 10000
-static int heap_slots = HEAP_MIN_SLOTS;
+static int add_objects = HEAP_MIN_SLOTS;
+/* tiny heap size */
+// 32KB
+#define HEAP_SIZE 0x8000
+// 128KB
+//#define HEAP_SIZE 0x20000
+// 64KB
+//#define HEAP_SIZE 0x10000
+// 16KB
+//#define HEAP_SIZE 0x4000
+// 8KB
+//#define HEAP_SIZE 0x2000
+// 4KB
+//#define HEAP_SIZE 0x1000
+// 2KB
+//#define HEAP_SIZE 0x800
+
+#define HEAP_OBJ_LIMIT (HEAP_SIZE / sizeof(struct RVALUE))
#define FREE_MIN 4096
+static int add_inc_time = 0;
static RVALUE *himem, *lomem;
@@ -179,8 +196,6 @@
size_t rb_gc_stack_maxsize = 655300*sizeof(VALUE);
#endif
-
-
static void run_final(VALUE obj);
static int garbage_collect(void);
@@ -417,43 +432,39 @@
}
}
+
static void
-add_heap(void)
+allocate_heaps(void)
{
+ struct heaps_slot *p;
+ int length;
+
+ heaps_length += add_objects / HEAP_OBJ_LIMIT;
+ length = heaps_length*sizeof(struct heaps_slot);
+ RUBY_CRITICAL(
+ if (heaps_used > 0) {
+ p = (struct heaps_slot *)realloc(heaps, length);
+ if (p) heaps = p;
+ }
+ else {
+ p = heaps = (struct heaps_slot *)malloc(length);
+ }
+ );
+ if (p == 0) rb_memerror();
+}
+
+static void
+assign_heap_slot(void)
+{
RVALUE *p, *pend, *membase;
long hi, lo, mid;
+ int objs;
+
+ objs = HEAP_OBJ_LIMIT;
+ RUBY_CRITICAL(p = (RVALUE*)malloc(HEAP_SIZE));
+ if (p == 0)
+ rb_memerror();
- if (heaps_used == heaps_length) {
- /* Realloc heaps */
- struct heaps_slot *p;
- int length;
-
- heaps_length += HEAPS_INCREMENT;
- length = heaps_length*sizeof(struct heaps_slot);
- RUBY_CRITICAL(
- if (heaps_used > 0) {
- p = (struct heaps_slot *)realloc(heaps, length);
- if (p) heaps = p;
- }
- else {
- p = heaps = (struct heaps_slot *)malloc(length);
- });
- if (p == 0) rb_memerror();
- }
-
- for (;;) {
- RUBY_CRITICAL(p = (RVALUE*)malloc(sizeof(RVALUE)*(heap_slots+1)));
- if (p == 0) {
- if (heap_slots == HEAP_MIN_SLOTS) {
- rb_memerror();
- }
- heap_slots = HEAP_MIN_SLOTS;
- }
- else {
- break;
- }
- }
-
lo = 0;
hi = heaps_used;
while (lo < hi) {
@@ -471,21 +482,25 @@
}
membase = p;
- if ((VALUE)p % sizeof(RVALUE) == 0)
- heap_slots += 1;
- else
+
+ if ((VALUE)p % sizeof(RVALUE) != 0) {
p = (RVALUE*)((VALUE)p + sizeof(RVALUE) - ((VALUE)p % sizeof(RVALUE)));
+ if ((membase + HEAP_SIZE) < (p + HEAP_SIZE)) {
+ objs--;
+ }
+ }
+
+
if (hi < heaps_used) {
MEMMOVE(&heaps[hi+1], &heaps[hi], struct heaps_slot, heaps_used - hi);
}
heaps[hi].membase = membase;
heaps[hi].slot = p;
- heaps[hi].limit = heap_slots;
- pend = p + heap_slots;
+ heaps[hi].limit = objs;
+ pend = p + objs;
if (lomem == 0 || lomem > p) lomem = p;
if (himem < pend) himem = pend;
heaps_used++;
- heap_slots *= 1.8;
while (p < pend) {
p->as.free.flags = 0;
@@ -495,15 +510,56 @@
}
}
+static void
+add_heap(void)
+{
+ int add, i;
+
+ add = add_objects / HEAP_OBJ_LIMIT;
+ add_objects *= 1.8;
+
+ if ((heaps_used + add) > heaps_length) {
+ allocate_heaps();
+ }
+
+ for (i = 0; i < add; i++) {
+ assign_heap_slot();
+ }
+ add_inc_time = 0;
+}
+
+
+static void
+set_add_inc_time(void)
+{
+ add_inc_time += add_objects / HEAP_OBJ_LIMIT;
+ add_objects *= 1.8;
+
+ if ((heaps_used + add_inc_time) > heaps_length) {
+ allocate_heaps();
+ }
+}
+
+static int
+add_heap_increment(void)
+{
+ if (add_inc_time > 0) {
+ assign_heap_slot();
+ add_inc_time--;
+ return Qtrue;
+ }
+ return Qfalse;
+}
+
#define RANY(o) ((RVALUE*)(o))
static VALUE
rb_newobj_from_heap(void)
{
VALUE obj;
-
+
if (ruby_gc_stress || !freelist) {
- if(!garbage_collect()) {
+ if (!add_heap_increment() && !garbage_collect()) {
rb_memerror();
}
}
@@ -516,6 +572,7 @@
RANY(obj)->file = rb_sourcefile();
RANY(obj)->line = rb_sourceline();
#endif
+
return obj;
}
@@ -1202,6 +1259,9 @@
j++;
}
}
+ if (i != j) {
+ add_objects = heaps_used * HEAP_OBJ_LIMIT;
+ }
}
void rb_gc_abort_threads(void);
@@ -1212,15 +1272,14 @@
RVALUE *p, *pend, *final_list;
int freed = 0;
int i;
- unsigned long live = 0;
- unsigned long free_min = 0;
+ unsigned long live = 0, free_min = 0, do_heap_free = 0;
- for (i = 0; i < heaps_used; i++) {
- free_min += heaps[i].limit;
+ do_heap_free = (heaps_used * HEAP_OBJ_LIMIT) * 0.65;
+ free_min = (heaps_used * HEAP_OBJ_LIMIT) * 0.2;
+ if (free_min < FREE_MIN) {
+ do_heap_free = heaps_used * HEAP_OBJ_LIMIT;
+ free_min = FREE_MIN;
}
- free_min = free_min * 0.2;
- if (free_min < FREE_MIN)
- free_min = FREE_MIN;
if (source_filenames) {
st_foreach(source_filenames, sweep_source_filename, 0);
@@ -1263,7 +1322,7 @@
}
p++;
}
- if (n == heaps[i].limit && freed > free_min) {
+ if (n == heaps[i].limit && freed > do_heap_free) {
RVALUE *pp;
heaps[i].limit = 0;
@@ -1282,7 +1341,8 @@
}
malloc_increase = 0;
if (freed < free_min) {
- add_heap();
+ set_add_inc_time();
+ add_heap_increment();
}
during_gc = 0;
@@ -1572,6 +1632,7 @@
}
gc_sweep();
+
if (GC_NOTIFY) printf("end garbage_collect()\n");
return Qtrue;
}