]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44890: collect specialization stats if Py_DEBUG (GH-27731)
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>
Thu, 12 Aug 2021 11:15:06 +0000 (12:15 +0100)
committerGitHub <noreply@github.com>
Thu, 12 Aug 2021 11:15:06 +0000 (12:15 +0100)
Include/internal/pycore_code.h
Misc/NEWS.d/next/Core and Builtins/2021-08-11-16-46-27.bpo-44890.PwNg8N.rst [new file with mode: 0644]
Modules/_opcode.c
Python/ceval.c
Python/specialize.c

index 7ae7aee961c3a09aaffc3bfef1764cc1f6562837..85f09544d4a09101a33188b4cd082e149b5150fa 100644 (file)
@@ -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 (file)
index 0000000..48a1c8b
--- /dev/null
@@ -0,0 +1 @@
+Specialization stats are always collected in debug builds.
\ No newline at end of file
index d440b5c51adc39a89b7a6fe835cef04878de2352..39e30669559518c068ed1b5a62f2dc61b80af609 100644 (file)
@@ -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;
index f494e8477fac714aa733ffefa6a414969502823f..111689ff629802dac6cde3fb2a85266b89bfbd0f 100644 (file)
@@ -341,7 +341,7 @@ PyEval_InitThreads(void)
 void
 _PyEval_Fini(void)
 {
-#if SPECIALIZATION_STATS
+#if PRINT_SPECIALIZATION_STATS
     _Py_PrintSpecializationStats();
 #endif
 }
index f0d68f027d64648ca13dc14dbe473a16851d15a4..e653ae41c57780491826e28815432e0393cade42 100644 (file)
@@ -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]++