summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/gc.c b/gc.c
index 118c49ebd6..d97ecfbc45 100644
--- a/gc.c
+++ b/gc.c
@@ -113,11 +113,15 @@ typedef struct gc_profile_record {
static double
getrusage_time(void)
{
+#ifdef RUSAGE_SELF
struct rusage usage;
struct timeval time;
getrusage(RUSAGE_SELF, &usage);
time = usage.ru_utime;
return time.tv_sec + time.tv_usec * 1e-6;
+#else
+ return 0.0;
+#endif
}
#define GC_PROF_TIMER_START do {\
@@ -142,7 +146,7 @@ getrusage_time(void)
#define GC_PROF_TIMER_STOP do {\
if (objspace->profile.run) {\
gc_time = getrusage_time() - gc_time;\
- if(gc_time < 0) gc_time = 0;\
+ if (gc_time < 0) gc_time = 0;\
objspace->profile.record[count].gc_time = gc_time;\
objspace->profile.count++;\
}\
@@ -2705,43 +2709,40 @@ gc_profile_result(void)
{
rb_objspace_t *objspace = &rb_objspace;
VALUE record = gc_profile_record_get();
- VALUE result = rb_str_new2("");
+ VALUE result;
int i;
- char buf[1024];
- if(objspace->profile.run && objspace->profile.count) {
- sprintf(buf, "GC %1$d invokes.\n", NUM2INT(gc_count(0)));
- rb_str_concat(result, rb_str_new2(buf));
- rb_str_concat(result, rb_str_new2("Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC Time(ms)\n"));
- for(i = 0; i < (int)RARRAY_LEN(record); i++) {
- memset(buf, 0, 1024);
+ if (objspace->profile.run && objspace->profile.count) {
+ result = rb_sprintf("GC %1$d invokes.\n", NUM2INT(gc_count(0)));
+ rb_str_cat2(result, "Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC Time(ms)\n");
+ for (i = 0; i < (int)RARRAY_LEN(record); i++) {
VALUE r = RARRAY_PTR(record)[i];
- sprintf(buf, "%1$5d %2$19.3f %3$20d %4$20d %5$20d %6$30.20f\n",
- i+1, NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_INVOKE_TIME")))),
- NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_USE_SIZE")))),
- NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_TOTAL_SIZE")))),
- NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_TOTAL_OBJECTS")))),
- NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_TIME"))))*100);
- rb_str_concat(result, rb_str_new2(buf));
+ rb_str_catf(result, "%1$5d %2$19.3f %3$20d %4$20d %5$20d %6$30.20f\n",
+ i+1, NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_INVOKE_TIME")))),
+ NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_USE_SIZE")))),
+ NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_TOTAL_SIZE")))),
+ NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_TOTAL_OBJECTS")))),
+ NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_TIME"))))*100);
}
#if GC_PROFILE_MORE_DETAIL
rb_str_concat(result, rb_str_new2("\n\n"));
rb_str_concat(result, rb_str_new2("More detail.\n"));
rb_str_concat(result, rb_str_new2("Index Allocate Increase Allocate Limit Use Slot Have Finalize Mark Time(ms) Sweep Time(ms)\n"));
- for(i = 0; i < (int)RARRAY_LEN(record); i++) {
- memset(buf, 0, 1024);
+ for (i = 0; i < (int)RARRAY_LEN(record); i++) {
VALUE r = RARRAY_PTR(record)[i];
- sprintf(buf, "%1$5d %2$17d %3$17d %4$9d %5$14s %6$25.20f %7$25.20f\n",
- i+1, NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("ALLOCATE_INCREASE")))),
- NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("ALLOCATE_LIMIT")))),
- NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_USE_SLOTS")))),
- rb_hash_aref(r, ID2SYM(rb_intern("HAVE_FINALIZE")))? "true" : "false",
- NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_MARK_TIME"))))*100,
- NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_SWEEP_TIME"))))*100);
- rb_str_concat(result, rb_str_new2(buf));
+ rb_str_catf(result, "%1$5d %2$17d %3$17d %4$9d %5$14s %6$25.20f %7$25.20f\n",
+ i+1, NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("ALLOCATE_INCREASE")))),
+ NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("ALLOCATE_LIMIT")))),
+ NUM2INT(rb_hash_aref(r, ID2SYM(rb_intern("HEAP_USE_SLOTS")))),
+ rb_hash_aref(r, ID2SYM(rb_intern("HAVE_FINALIZE")))? "true" : "false",
+ NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_MARK_TIME"))))*100,
+ NUM2DBL(rb_hash_aref(r, ID2SYM(rb_intern("GC_SWEEP_TIME"))))*100);
}
#endif
}
+ else {
+ result = rb_str_new2("");
+ }
return result;
}