Skip to content

Instantly share code, notes, and snippets.

@ttilley
Created November 3, 2012 23:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ttilley/4009244 to your computer and use it in GitHub Desktop.
Save ttilley/4009244 to your computer and use it in GitHub Desktop.
diff --git c/gc.c w/gc.c
index 861379b..2f4d596 100644
--- c/gc.c
+++ w/gc.c
@@ -86,11 +86,13 @@ void *alloca ();
#endif
#define HEAP_MIN_SLOTS 10000
#define FREE_MIN 4096
+#define HEAP_SLOTS_GROWTH_FACTOR 1.8
typedef struct {
unsigned int initial_malloc_limit;
unsigned int initial_heap_min_slots;
unsigned int initial_free_min;
+ double initial_heap_slots_growth_factor;
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
int gc_stress;
#endif
@@ -100,6 +102,7 @@ static ruby_gc_params_t initial_params = {
GC_MALLOC_LIMIT,
HEAP_MIN_SLOTS,
FREE_MIN,
+ HEAP_SLOTS_GROWTH_FACTOR,
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
FALSE,
#endif
@@ -444,6 +447,7 @@ int *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#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_heap_slots_growth_factor initial_params.initial_heap_slots_growth_factor
#define is_lazy_sweeping(objspace) ((objspace)->heap.sweep_slots != 0)
@@ -478,7 +482,7 @@ static void initial_expand_heap(rb_objspace_t *objspace);
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, *heap_slots_growth_factor_ptr;
if (rb_safe_level() > 0) return;
@@ -505,7 +509,8 @@ rb_gc_set_params(void)
}
}
- free_min_ptr = getenv("RUBY_FREE_MIN");
+ if (!(free_min_ptr = getenv("RUBY_FREE_MIN")))
+ free_min_ptr = getenv("RUBY_HEAP_FREE_MIN");
if (free_min_ptr != NULL) {
int free_min_i = atoi(free_min_ptr);
if (RTEST(ruby_verbose))
@@ -514,6 +519,17 @@ rb_gc_set_params(void)
initial_free_min = free_min_i;
}
}
+
+ heap_slots_growth_factor_ptr = getenv("RUBY_HEAP_SLOTS_GROWTH_FACTOR");
+ if (heap_slots_growth_factor_ptr != NULL) {
+ double growth_factor_d = atof(heap_slots_growth_factor_ptr);
+ if (RTEST(ruby_verbose))
+ fprintf(stderr, "heap_slots_growth_factor=%g (%g)\n",
+ growth_factor_d, initial_heap_slots_growth_factor);
+ if (growth_factor_d > 0) {
+ initial_heap_slots_growth_factor = growth_factor_d;
+ }
+ }
}
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
@@ -1302,7 +1318,7 @@ initial_expand_heap(rb_objspace_t *objspace)
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_heap_slots_growth_factor);
if (next_heaps_length == heaps_used) {
next_heaps_length++;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment