まつもと ゆきひろです

In message "[ruby-dev:3306] Re: exprimental release 1.1b9_31 (hopefully final)"
    on 98/07/16, Takahiro Maebashi <maebashi / iij.ad.jp> writes:

|前橋です。

|html-parser そのものでは長すぎるので、現象が再現できる短いスクリプトを考
|えてみました。

(略)

ありがとうございます.なるほどそういうケースを忘れてました.
結局毎回割り当てられる文字列の長さが長いので,たいしてオブジェ
クトを割り当ててないのに(よって解放するべきオブジェクトもろ
くにないのに)GCばかり呼ばれてしまうのが原因なんですね.

オブジェクトを割り当ててないのにGCを呼ぶのもばかばかしいので,
mallocしたバイト数に加えて割り当てたオブジェクト数も条件に加
えたところ実行速度が改善されたような気がします.

いかがでしょう?

--- gc.c	1998/07/15 06:12:49	1.1.1.2.2.20
+++ gc.c	1998/07/16 07:32:04
@@ -44,5 +44,11 @@
 #endif
+#define GC_NEWOBJ_LIMIT 1000
 
 static unsigned long malloc_memories = 0;
+static unsigned long alloc_objects = 0;
 
+/* for future statistics analysis. */
+static int marked = 0;
+static int freeobj = 0;
+
 void *
@@ -58,3 +64,3 @@
     malloc_memories += size;
-    if (malloc_memories > GC_MALLOC_LIMIT) {
+    if (malloc_memories > GC_MALLOC_LIMIT && alloc_objects > GC_NEWOBJ_LIMIT) {
 	gc_gc();
@@ -255,2 +258,3 @@
 	freelist = freelist->as.free.next;
+	alloc_objects++;
 	return obj;
@@ -623,2 +628,3 @@
     }
+    alloc_objects = 0;
     if (freed < FREE_MIN) {