[sgen] Heavy statistics on copied object descriptors.
authorMark Probst <mark.probst@gmail.com>
Sun, 7 Sep 2014 16:41:39 +0000 (18:41 +0200)
committerMark Probst <mark.probst@gmail.com>
Wed, 26 Nov 2014 18:38:38 +0000 (10:38 -0800)
mono/metadata/sgen-descriptor.c
mono/metadata/sgen-descriptor.h
mono/metadata/sgen-marksweep.c

index 33ca6a780b747e5cc4bf108ee212825063a0b0cd..d99556e8b96224044e01b161eada2561f4617c04 100644 (file)
@@ -61,6 +61,7 @@ static void *all_ref_root_descrs [32];
 
 #ifdef HEAVY_STATISTICS
 static long long stat_scanned_count_per_descriptor [DESC_TYPE_MAX];
+static long long stat_copied_count_per_descriptor [DESC_TYPE_MAX];
 #endif
 
 static int
@@ -362,6 +363,14 @@ sgen_descriptor_count_scanned_object (mword desc)
        SGEN_ASSERT (0, type, "Descriptor type can't be zero");
        ++stat_scanned_count_per_descriptor [type - 1];
 }
+
+void
+sgen_descriptor_count_copied_object (mword desc)
+{
+       int type = desc & 7;
+       SGEN_ASSERT (0, type, "Descriptor type can't be zero");
+       ++stat_copied_count_per_descriptor [type - 1];
+}
 #endif
 
 void
@@ -375,6 +384,14 @@ sgen_init_descriptors (void)
        mono_counters_register ("# scanned LARGE_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_LARGE_BITMAP - 1]);
        mono_counters_register ("# scanned COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]);
        mono_counters_register ("# scanned COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_scanned_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]);
+
+       mono_counters_register ("# copied RUN_LENGTH", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_RUN_LENGTH - 1]);
+       mono_counters_register ("# copied SMALL_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_SMALL_BITMAP - 1]);
+       mono_counters_register ("# copied COMPLEX", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX - 1]);
+       mono_counters_register ("# copied VECTOR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_VECTOR - 1]);
+       mono_counters_register ("# copied LARGE_BITMAP", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_LARGE_BITMAP - 1]);
+       mono_counters_register ("# copied COMPLEX_ARR", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_ARR - 1]);
+       mono_counters_register ("# copied COMPLEX_PTRFREE", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_copied_count_per_descriptor [DESC_TYPE_COMPLEX_PTRFREE - 1]);
 #endif
 }
 
index 153b175c6cdede595fb56c7c009bc739a90eab67..467cc6cb470fc925b9a53409187ad61e4d08dc86 100644 (file)
@@ -121,6 +121,7 @@ void sgen_init_descriptors (void) MONO_INTERNAL;
 
 #ifdef HEAVY_STATISTICS
 void sgen_descriptor_count_scanned_object (mword desc) MONO_INTERNAL;
+void sgen_descriptor_count_copied_object (mword desc) MONO_INTERNAL;
 #endif
 
 static inline gboolean
index bbb741389a2812f04b3b7c4fd9b99842117b65fa..d3ab7a2a0ff32605a4411da2964b496a252b8e1e 100644 (file)
@@ -1170,7 +1170,19 @@ optimized_copy_or_mark_object (void **ptr, void *obj, SgenGrayQueue *queue)
        MSBlockInfo *block;
 #endif
 
-       HEAVY_STAT (++stat_optimized_copy);
+#ifdef HEAVY_STATISTICS
+       ++stat_optimized_copy;
+       {
+               char *forwarded;
+               mword desc;
+               if ((forwarded = SGEN_OBJECT_IS_FORWARDED (obj)))
+                       desc = sgen_obj_get_descriptor_safe (forwarded);
+               else
+                       desc = sgen_obj_get_descriptor_safe (obj);
+
+               sgen_descriptor_count_copied_object (desc);
+       }
+#endif
 
        SGEN_ASSERT (9, obj, "null object from pointer %p", ptr);
        SGEN_ASSERT (9, current_collection_generation == GENERATION_OLD, "old gen parallel allocator called from a %d collection", current_collection_generation);