| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 3b80c93 commit ff81eb2
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -193,6 +193,9 @@ struct gc_generation_stats { | |||
| 193 | 193 | /* total number of uncollectable objects (put into gc.garbage) */ | |
| 194 | 194 | Py_ssize_t uncollectable; | |
| 195 | 195 | Py_ssize_t untracked_tuples; | |
| 196 | + Py_ssize_t total_untracked_tuples; | ||
| 197 | + Py_ssize_t total_tuples; | ||
| 198 | + Py_ssize_t tuples_by_size[33]; | ||
| 196 | 199 | }; | |
| 197 | 200 | ||
| 198 | 201 | enum _GCPhase { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -22,6 +22,44 @@ class tuple "PyTupleObject *" "&PyTuple_Type" | |||
| 22 | 22 | ||
| 23 | 23 | static inline int maybe_freelist_push(PyTupleObject *); | |
| 24 | 24 | ||
| 25 | + static uint8_t | ||
| 26 | + _log2_int(Py_ssize_t size) | ||
| 27 | + { | ||
| 28 | + if (size == 0) { | ||
| 29 | + return 0; | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + const uint64_t b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000}; | ||
| 33 | + const uint64_t S[] = {1, 2, 4, 8, 16, 32}; | ||
| 34 | + | ||
| 35 | + int64_t v = size; | ||
| 36 | + uint8_t r = 0; // result of log2(v) will go here | ||
| 37 | + for (int i = 5; i >= 0; i--) // unroll for speed... | ||
| 38 | + { | ||
| 39 | + if (v & b[i]) | ||
| 40 | + { | ||
| 41 | + v >>= S[i]; | ||
| 42 | + r |= S[i]; | ||
| 43 | + } | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + #ifdef Py_DEBUG | ||
| 47 | + uint8_t x = (uint8_t)log2((double)size); | ||
| 48 | + assert(x == r); | ||
| 49 | + #endif | ||
| 50 | + | ||
| 51 | + return r + 1; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + static void | ||
| 55 | + _count_tuple(Py_ssize_t size) | ||
| 56 | + { | ||
| 57 | + PyInterpreterState *interp = _PyInterpreterState_GET(); | ||
| 58 | + interp->gc.generation_stats[0].total_tuples += 1; | ||
| 59 | + uint8_t size_index = _log2_int(size); | ||
| 60 | + interp->gc.generation_stats[0].tuples_by_size[size_index] += 1; | ||
| 61 | + } | ||
| 62 | + | ||
| 25 | 63 | ||
| 26 | 64 | /* Allocate an uninitialized tuple object. Before making it public, following | |
| 27 | 65 | steps must be done: | |
@@ -46,6 +84,7 @@ tuple_alloc(Py_ssize_t size) | |||
| 46 | 84 | PyTupleObject *op = _Py_FREELIST_POP(PyTupleObject, tuples[index]); | |
| 47 | 85 | if (op != NULL) { | |
| 48 | 86 | _PyTuple_RESET_HASH_CACHE(op); | |
| 87 | + _count_tuple(size); | ||
| 49 | 88 | return op; | |
| 50 | 89 | } | |
| 51 | 90 | } | |
@@ -57,6 +96,7 @@ tuple_alloc(Py_ssize_t size) | |||
| 57 | 96 | PyTupleObject *result = PyObject_GC_NewVar(PyTupleObject, &PyTuple_Type, size); | |
| 58 | 97 | if (result != NULL) { | |
| 59 | 98 | _PyTuple_RESET_HASH_CACHE(result); | |
| 99 | + _count_tuple(size); | ||
| 60 | 100 | } | |
| 61 | 101 | return result; | |
| 62 | 102 | } | |
@@ -68,6 +108,7 @@ tuple_alloc(Py_ssize_t size) | |||
| 68 | 108 | static inline PyObject * | |
| 69 | 109 | tuple_get_empty(void) | |
| 70 | 110 | { | |
| 111 | + _count_tuple(0); | ||
| 71 | 112 | return (PyObject *)&_Py_SINGLETON(tuple_empty); | |
| 72 | 113 | } | |
| 73 | 114 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2101,6 +2101,7 @@ _PyGC_Collect(PyThreadState *tstate, int generation, _PyGC_Reason reason) | |||
| 2101 | 2101 | Py_UNREACHABLE(); | |
| 2102 | 2102 | } | |
| 2103 | 2103 | gcstate->generation_stats[generation].untracked_tuples += stats.untracked_tuples; | |
| 2104 | + gcstate->generation_stats[0].total_untracked_tuples += stats.untracked_tuples; | ||
| 2104 | 2105 | if (PyDTrace_GC_DONE_ENABLED()) { | |
| 2105 | 2106 | PyDTrace_GC_DONE(stats.uncollectable + stats.collected); | |
| 2106 | 2107 | } | |
@@ -2109,6 +2110,13 @@ _PyGC_Collect(PyThreadState *tstate, int generation, _PyGC_Reason reason) | |||
| 2109 | 2110 | } | |
| 2110 | 2111 | else { | |
| 2111 | 2112 | FILE *out = stderr; | |
| 2113 | + | ||
| 2114 | + fprintf(out, "GC[%d] total tuples : %zd\n", 0, gcstate->generation_stats[0].total_tuples); | ||
| 2115 | + fprintf(out, "GC[%d] total untracked_tuples : %zd\n", 0, gcstate->generation_stats[0].total_untracked_tuples); | ||
| 2116 | + for (int i = 0; i < 33; i++) { | ||
| 2117 | + fprintf(out, "GC[%d] by size %d : %zd\n", 0, i, gcstate->generation_stats[0].tuples_by_size[i]); | ||
| 2118 | + } | ||
| 2119 | + | ||
| 2112 | 2120 | for (int i = 0; i < NUM_GENERATIONS; i++) { | |
| 2113 | 2121 | fprintf(out, "GC[%d] collections : %zd\n", i, gcstate->generation_stats[i].collections); | |
| 2114 | 2122 | fprintf(out, "GC[%d] collected : %zd\n", i, gcstate->generation_stats[i].collected); | |
| Back | FazBrowse Home | New Git URL |
0 commit comments