[#15067] rb_eval_string — OJ <oj@...7.com>

OJです。

39 messages 2001/11/08
[#15068] Re: rb_eval_string — nobu.nakada@... 2001/11/08

なかだです。

[#15069] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/08

OJです。

[#15071] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15077] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/09

OJです。

[#15078] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/09

わたなべです。

[#15083] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15088] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15089] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15092] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15096] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15109] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15112] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15114] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15115] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15119] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15121] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15124] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15126] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>

18 messages 2001/11/15
[#15176] Re: strange behavior about PTY.spawn — matz@... (Yukihiro Matsumoto) 2001/11/15

まつもと ゆきひろです

[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>

 というわけで 1.7 に syslog モジュールを入れました。

43 messages 2001/11/26

[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

25 messages 2001/11/28
[#15271] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128181510.3D11.USA@osb.att.ne.jp>

[#15272] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/28

こんにちは、なかむら(う)です。

[#15278] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128182726.3D14.USA@osb.att.ne.jp>

[#15296] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/29

こんにちは、なかむら(う)です。

[#15298] time.rb — Tanaka Akira <akr@...17n.org>

というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。

27 messages 2001/11/29

[ruby-dev:15249] Re: gc.c (gc_mark_rest): declare work area as static

From: "K.Kosako" <kosako@...>
Date: 2001-11-26 07:35:56 UTC
List: ruby-dev #15249
Yukihiro Matsumotoさんの<1006756628.559001.23763.nullmailer@ev.netlab.jp>から
> |スタックが許す限りrb_gc_mark()を再帰呼び出しするように、少しだけ変更してみました。
> |この変更が意味をもつように恣意的に書いたスクリプトでだけ、かなりGCの速度が
> |向上するのですが、ボツになると思われるのでパッチは出さないでおきます。
> |(どうして最初からそうなっていないのかが、判らないのですが。)
> 
> もったいない。なぜボツになると思われたのですか?

以下のスクリプトなんですが、
ネストの深さとデータの参照の深さの調整に苦労したので、
普通のスクリプトを書いている人には全く関係のない"改良"としか
思えなかったので。
(ただ、私のようなプログラム鑑賞派にとっては、
gc_mark_all()とgc_mark_rest()の処理の対称性が向上するので嬉しい。)

パッチのほうは、sheepmanさんの修正[ruby-dev:15242]を行ったものに対する
パッチです。

GC::disable

gc = lambda {
  puts "GC start..."
  GC::enable
  tstart = Time::now
  GC::start
  tend = Time::now
  GC::disable
  puts "GC end"

  [tstart, tend]
}

def nest(level, what, *args)
  if level == 0
    return what.call(*args)
  else
    return nest(level - 1, what)
  end
end

def make(level)
  if level == 0
    return nil
  else
    level -= 1
    if level < 11
      return [make(level)]
    else
      return [make(level), make(level)]
    end
  end
end

def interval(ts, te)
  return (te.tv_sec - ts.tv_sec) * 1000000 + (te.usec - ts.usec)
end

x = make(25)

LEVEL = 1780
t = 0
ts, te = nest(LEVEL, gc)
t += interval(ts, te)
ts, te = nest(LEVEL, gc)
t += interval(ts, te)
ts, te = nest(LEVEL, gc)
t += interval(ts, te)
ts, te = nest(LEVEL, gc)
t += interval(ts, te)
ts, te = nest(LEVEL, gc)
t += interval(ts, te)
printf("average time: %d usec.\n", t.to_f / 5.0)
# => 2739469 (original)
# =>  581386 (modify)


--- gc.c.orig	Mon Nov 26 16:10:15 2001
+++ gc.c	Mon Nov 26 16:14:42 2001
@@ -427,26 +427,23 @@
 
 #define MARK_STACK_EMPTY (mark_stack_ptr == mark_stack)
             
-static int mark_all;
-
 static void rb_gc_mark_children(VALUE ptr);
+
 static void
 gc_mark_all()
 {
     RVALUE *p, *pend;
     int i;
-    mark_all = 0;
-    while(!mark_all){
-	mark_all = 1;
-	for (i = 0; i < heaps_used; i++) {
-	    p = heaps[i]; pend = p + heaps_limits[i];
-	    while (p < pend) {
-		if ((p->as.basic.flags & FL_MARK) &&
-		    (p->as.basic.flags != FL_MARK)) {
-		    rb_gc_mark_children((VALUE)p);
-		}
-		p++;
+
+    init_mark_stack();
+    for (i = 0; i < heaps_used; i++) {
+	p = heaps[i]; pend = p + heaps_limits[i];
+	while (p < pend) {
+	    if ((p->as.basic.flags & FL_MARK) &&
+		(p->as.basic.flags != FL_MARK)) {
+		rb_gc_mark_children((VALUE)p);
 	    }
+	    p++;
 	}
     }
 }
@@ -565,6 +562,7 @@
 rb_gc_mark(ptr)
     VALUE ptr;
 {
+    int ret;
     register RVALUE *obj = RANY(ptr);
 
     if (rb_special_const_p(ptr)) return; /* special const not marked */
@@ -573,23 +571,21 @@
 
     obj->as.basic.flags |= FL_MARK;
 
-     if (mark_stack_overflow){
-	mark_all &= 0;
-     }else{
-	int ret;
-	CHECK_STACK(ret);
-	if (ret) {
+    CHECK_STACK(ret);
+    if (ret) {
+	if (!mark_stack_overflow) {
 	    if (mark_stack_ptr - mark_stack < MARK_STACK_MAX) {
 		*mark_stack_ptr = ptr;
 		mark_stack_ptr++;		
-	    }else{
+	    }
+	    else {
 		mark_stack_overflow = 1;
 	    }
-	}else{
-	    rb_gc_mark_children(ptr);
 	}
     }
-    
+    else {
+	rb_gc_mark_children(ptr);
+    }
 }
 
 void
@@ -1172,7 +1168,6 @@
     while (!MARK_STACK_EMPTY){
 	if (mark_stack_overflow){
 	    gc_mark_all();
-	    break;
 	}else{
 	    gc_mark_rest();
 	}
--
小迫@ソフネック   渋谷区恵比寿1-15-1

In This Thread