From 8ac0886091c27bf4b6bb0a9b571e174b554d31a4 Mon Sep 17 00:00:00 2001 From: Irit Katriel <1055913+iritkatriel@users.noreply.github.com> Date: Thu, 12 Aug 2021 12:15:06 +0100 Subject: bpo-44890: collect specialization stats if Py_DEBUG (GH-27731) --- Include/internal/pycore_code.h | 13 ++++++++----- .../2021-08-11-16-46-27.bpo-44890.PwNg8N.rst | 1 + Modules/_opcode.c | 2 +- Python/ceval.c | 2 +- Python/specialize.c | 12 ++++++------ 5 files changed, 17 insertions(+), 13 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst diff --git a/Include/internal/pycore_code.h b/Include/internal/pycore_code.h index 7ae7aee..85f0954 100644 --- a/Include/internal/pycore_code.h +++ b/Include/internal/pycore_code.h @@ -301,13 +301,16 @@ int _Py_Specialize_StoreAttr(PyObject *owner, _Py_CODEUNIT *instr, PyObject *nam int _Py_Specialize_LoadGlobal(PyObject *globals, PyObject *builtins, _Py_CODEUNIT *instr, PyObject *name, SpecializedCacheEntry *cache); int _Py_Specialize_BinarySubscr(PyObject *sub, PyObject *container, _Py_CODEUNIT *instr); -#define SPECIALIZATION_STATS 0 -#define SPECIALIZATION_STATS_DETAILED 0 -#define SPECIALIZATION_STATS_TO_FILE 0 +#define PRINT_SPECIALIZATION_STATS 0 +#define PRINT_SPECIALIZATION_STATS_DETAILED 0 +#define PRINT_SPECIALIZATION_STATS_TO_FILE 0 + +#define COLLECT_SPECIALIZATION_STATS (Py_DEBUG || PRINT_SPECIALIZATION_STATS) +#define COLLECT_SPECIALIZATION_STATS_DETAILED (Py_DEBUG || PRINT_SPECIALIZATION_STATS_DETAILED) #define SPECIALIZATION_FAILURE_KINDS 20 -#if SPECIALIZATION_STATS +#if COLLECT_SPECIALIZATION_STATS typedef struct _stats { uint64_t specialization_success; @@ -317,7 +320,7 @@ typedef struct _stats { uint64_t miss; uint64_t deopt; uint64_t unquickened; -#if SPECIALIZATION_STATS_DETAILED +#if COLLECT_SPECIALIZATION_STATS_DETAILED uint64_t specialization_failure_kinds[SPECIALIZATION_FAILURE_KINDS]; #endif } SpecializationStats; diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst new file mode 100644 index 0000000..48a1c8b --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst @@ -0,0 +1 @@ +Specialization stats are always collected in debug builds. \ No newline at end of file diff --git a/Modules/_opcode.c b/Modules/_opcode.c index d440b5c..39e3066 100644 --- a/Modules/_opcode.c +++ b/Modules/_opcode.c @@ -85,7 +85,7 @@ static PyObject * _opcode_get_specialization_stats_impl(PyObject *module) /*[clinic end generated code: output=fcbc32fdfbec5c17 input=e1f60db68d8ce5f6]*/ { -#if SPECIALIZATION_STATS +#if COLLECT_SPECIALIZATION_STATS return _Py_GetSpecializationStats(); #else Py_RETURN_NONE; diff --git a/Python/ceval.c b/Python/ceval.c index f494e84..111689f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -341,7 +341,7 @@ PyEval_InitThreads(void) void _PyEval_Fini(void) { -#if SPECIALIZATION_STATS +#if PRINT_SPECIALIZATION_STATS _Py_PrintSpecializationStats(); #endif } diff --git a/Python/specialize.c b/Python/specialize.c index f0d68f0..e653ae4 100644 --- a/Python/specialize.c +++ b/Python/specialize.c @@ -37,7 +37,7 @@ */ Py_ssize_t _Py_QuickenedCount = 0; -#if SPECIALIZATION_STATS +#if COLLECT_SPECIALIZATION_STATS SpecializationStats _specialization_stats[256] = { 0 }; #define ADD_STAT_TO_DICT(res, field) \ @@ -69,7 +69,7 @@ stats_to_dict(SpecializationStats *stats) ADD_STAT_TO_DICT(res, miss); ADD_STAT_TO_DICT(res, deopt); ADD_STAT_TO_DICT(res, unquickened); -#if SPECIALIZATION_STATS_DETAILED +#if COLLECT_SPECIALIZATION_STATS_DETAILED PyObject *failure_kinds = PyTuple_New(SPECIALIZATION_FAILURE_KINDS); if (failure_kinds == NULL) { Py_DECREF(res); @@ -111,7 +111,7 @@ add_stat_dict( return err; } -#if SPECIALIZATION_STATS +#if COLLECT_SPECIALIZATION_STATS PyObject* _Py_GetSpecializationStats(void) { PyObject *stats = PyDict_New(); @@ -144,7 +144,7 @@ print_stats(FILE *out, SpecializationStats *stats, const char *name) PRINT_STAT(name, miss); PRINT_STAT(name, deopt); PRINT_STAT(name, unquickened); -#if SPECIALIZATION_STATS_DETAILED +#if PRINT_SPECIALIZATION_STATS_DETAILED for (int i = 0; i < SPECIALIZATION_FAILURE_KINDS; i++) { fprintf(out, " %s.specialization_failure_kinds[%d] : %" PRIu64 "\n", name, i, stats->specialization_failure_kinds[i]); @@ -157,7 +157,7 @@ void _Py_PrintSpecializationStats(void) { FILE *out = stderr; -#if SPECIALIZATION_STATS_TO_FILE +#if PRINT_SPECIALIZATION_STATS_TO_FILE /* Write to a file instead of stderr. */ # ifdef MS_WINDOWS const char *dirname = "c:\\temp\\py_stats\\"; @@ -182,7 +182,7 @@ _Py_PrintSpecializationStats(void) } } -#if SPECIALIZATION_STATS_DETAILED +#if COLLECT_SPECIALIZATION_STATS_DETAILED #define SPECIALIZATION_FAIL(opcode, kind) _specialization_stats[opcode].specialization_failure_kinds[kind]++ -- cgit v0.12