[前][次][番号順一覧][スレッド一覧]

ruby-changes:27694

From: nari <ko1@a...>
Date: Wed, 13 Mar 2013 23:55:45 +0900 (JST)
Subject: [ruby-changes:27694] nari:r39746 (trunk): * gc.c: allow to tune growth of heap by environment variable

nari	2013-03-13 23:52:00 +0900 (Wed, 13 Mar 2013)

  New Revision: 39746

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=39746

  Log:
    * gc.c: allow to tune growth of heap by environment variable
      RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta).
      [Feature #8015] [ruby-core:53131]

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
    trunk/test/ruby/test_gc.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 39745)
+++ ChangeLog	(revision 39746)
@@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Mar 13 23:25:59 2013  Narihiro Nakamura  <authornari@g...>
+
+	* gc.c: allow to tune growth of heap by environment variable
+	  RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta).
+	  [Feature #8015] [ruby-core:53131]
+
 Wed Mar 13 19:43:46 2013  Kazuhiro NISHIYAMA  <zn@m...>
 
 	* doc/irb/irb.rd.ja: fix typo
Index: gc.c
===================================================================
--- gc.c	(revision 39745)
+++ gc.c	(revision 39746)
@@ -71,11 +71,13 @@ https://github.com/ruby/ruby/blob/trunk/gc.c#L71
 #endif
 #define HEAP_MIN_SLOTS 10000
 #define FREE_MIN  4096
+#define HEAP_GROWTH_FACTOR 1.8
 
 typedef struct {
     unsigned int initial_malloc_limit;
     unsigned int initial_heap_min_slots;
     unsigned int initial_free_min;
+    double initial_growth_factor;
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     int gc_stress;
 #endif
@@ -85,6 +87,7 @@ static ruby_gc_params_t initial_params = https://github.com/ruby/ruby/blob/trunk/gc.c#L87
     GC_MALLOC_LIMIT,
     HEAP_MIN_SLOTS,
     FREE_MIN,
+    HEAP_GROWTH_FACTOR,
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
     FALSE,
 #endif
@@ -287,6 +290,7 @@ int *ruby_initial_gc_stress_ptr = &rb_ob https://github.com/ruby/ruby/blob/trunk/gc.c#L290
 #define initial_malloc_limit	initial_params.initial_malloc_limit
 #define initial_heap_min_slots	initial_params.initial_heap_min_slots
 #define initial_free_min	initial_params.initial_free_min
+#define initial_growth_factor	initial_params.initial_growth_factor
 
 #define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
 
@@ -605,7 +609,7 @@ initial_expand_heap(rb_objspace_t *objsp https://github.com/ruby/ruby/blob/trunk/gc.c#L609
 static void
 set_heaps_increment(rb_objspace_t *objspace)
 {
-    size_t next_heaps_length = (size_t)(heaps_used * 1.8);
+    size_t next_heaps_length = (size_t)(heaps_used * initial_growth_factor);
 
     if (next_heaps_length == heaps_used) {
         next_heaps_length++;
@@ -3290,7 +3294,7 @@ rb_gc_disable(void) https://github.com/ruby/ruby/blob/trunk/gc.c#L3294
 void
 rb_gc_set_params(void)
 {
-    char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr;
+    char *malloc_limit_ptr, *heap_min_slots_ptr, *free_min_ptr, *growth_factor_ptr;
 
     if (rb_safe_level() > 0) return;
 
@@ -3317,6 +3321,17 @@ rb_gc_set_params(void) https://github.com/ruby/ruby/blob/trunk/gc.c#L3321
 	}
     }
 
+    growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+    if (growth_factor_ptr != NULL) {
+	double growth_factor_f = strtod(growth_factor_ptr, NULL);
+	if (RTEST(ruby_verbose))
+	    fprintf(stderr, "heap_slots_growth_factor=%f (%f)\n",
+		    growth_factor_f, initial_growth_factor);
+	if (growth_factor_f > 1) {
+	    initial_growth_factor = growth_factor_f;
+	}
+    }
+
     free_min_ptr = getenv("RUBY_FREE_MIN");
     if (free_min_ptr != NULL) {
 	int free_min_i = atoi(free_min_ptr);
Index: test/ruby/test_gc.rb
===================================================================
--- test/ruby/test_gc.rb	(revision 39745)
+++ test/ruby/test_gc.rb	(revision 39746)
@@ -108,6 +108,12 @@ class TestGc < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_gc.rb#L108
     assert_in_out_err([env, "-W0", "-e", "exit"], "", [], [], "[ruby-core:39795]")
     assert_in_out_err([env, "-W1", "-e", "exit"], "", [], [], "[ruby-core:39795]")
     assert_in_out_err([env, "-w", "-e", "exit"], "", [], /heap_min_slots=100000/, "[ruby-core:39795]")
+
+    env = {
+      "RUBY_HEAP_SLOTS_GROWTH_FACTOR" => "2.0"
+    }
+    assert_normal_exit("exit", "", :child_env => env)
+    assert_in_out_err([env, "-w", "-e", "exit"], "", [], /heap_slots_growth_factor=2.0/, "")
   end
 
   def test_profiler_enabled

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]