summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2021-08-04 10:39:52 (GMT)
committerGitHub <noreply@github.com>2021-08-04 10:39:52 (GMT)
commitc83919bd635f4433f1c6ae8504996a9fe3c215e5 (patch)
tree820040d9928408060179d684adc4775f98df76d0 /Python
parentac811f9b5a68ce8756911ef2c8be83b46696018f (diff)
downloadcpython-c83919bd635f4433f1c6ae8504996a9fe3c215e5.zip
cpython-c83919bd635f4433f1c6ae8504996a9fe3c215e5.tar.gz
cpython-c83919bd635f4433f1c6ae8504996a9fe3c215e5.tar.bz2
Add option to write specialization stats to files and script to summarize. (GH-27575)
* Add option to write stats to random file in a directory. * Add script to summarize stats.
Diffstat (limited to 'Python')
-rw-r--r--Python/ceval.c2
-rw-r--r--Python/specialize.c43
2 files changed, 33 insertions, 12 deletions
diff --git a/Python/ceval.c b/Python/ceval.c
index 4f7edb8..e3658b8 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4408,6 +4408,7 @@ opname ## _miss: \
cache_backoff(cache); \
} \
oparg = cache->original_oparg; \
+ STAT_DEC(opname, unquickened); \
JUMP_TO_INSTRUCTION(opname); \
}
@@ -4423,6 +4424,7 @@ opname ## _miss: \
next_instr[-1] = _Py_MAKECODEUNIT(opname ## _ADAPTIVE, oparg); \
STAT_INC(opname, deopt); \
} \
+ STAT_DEC(opname, unquickened); \
JUMP_TO_INSTRUCTION(opname); \
}
diff --git a/Python/specialize.c b/Python/specialize.c
index 680ffb4..1ca49d2 100644
--- a/Python/specialize.c
+++ b/Python/specialize.c
@@ -117,10 +117,10 @@ _Py_GetSpecializationStats(void) {
#endif
-#define PRINT_STAT(name, field) fprintf(stderr, " %s." #field " : %" PRIu64 "\n", name, stats->field);
+#define PRINT_STAT(name, field) fprintf(out, " %s." #field " : %" PRIu64 "\n", name, stats->field);
static void
-print_stats(SpecializationStats *stats, const char *name)
+print_stats(FILE *out, SpecializationStats *stats, const char *name)
{
PRINT_STAT(name, specialization_success);
PRINT_STAT(name, specialization_failure);
@@ -133,18 +133,18 @@ print_stats(SpecializationStats *stats, const char *name)
if (stats->miss_types == NULL) {
return;
}
- fprintf(stderr, " %s.fails:\n", name);
+ fprintf(out, " %s.fails:\n", name);
PyObject *key, *count;
Py_ssize_t pos = 0;
while (PyDict_Next(stats->miss_types, &pos, &key, &count)) {
PyObject *type = PyTuple_GetItem(key, 0);
PyObject *name = PyTuple_GetItem(key, 1);
PyObject *kind = PyTuple_GetItem(key, 2);
- fprintf(stderr, " %s.", ((PyTypeObject *)type)->tp_name);
- PyObject_Print(name, stderr, Py_PRINT_RAW);
- fprintf(stderr, " (");
- PyObject_Print(kind, stderr, Py_PRINT_RAW);
- fprintf(stderr, "): %ld\n", PyLong_AsLong(count));
+ fprintf(out, " %s.", ((PyTypeObject *)type)->tp_name);
+ PyObject_Print(name, out, Py_PRINT_RAW);
+ fprintf(out, " (");
+ PyObject_Print(kind, out, Py_PRINT_RAW);
+ fprintf(out, "): %ld\n", PyLong_AsLong(count));
}
#endif
}
@@ -153,10 +153,29 @@ print_stats(SpecializationStats *stats, const char *name)
void
_Py_PrintSpecializationStats(void)
{
- printf("Specialization stats:\n");
- print_stats(&_specialization_stats[LOAD_ATTR], "load_attr");
- print_stats(&_specialization_stats[LOAD_GLOBAL], "load_global");
- print_stats(&_specialization_stats[BINARY_SUBSCR], "binary_subscr");
+ FILE *out = stderr;
+#if SPECIALIZATION_STATS_TO_FILE
+ /* Write to a file instead of stderr. */
+# ifdef MS_WINDOWS
+ const char *dirname = "c:\\temp\\py_stats\\";
+# else
+ const char *dirname = "/tmp/py_stats/";
+# endif
+ char buf[48];
+ sprintf(buf, "%s%u_%u.txt", dirname, (unsigned)clock(), (unsigned)rand());
+ FILE *fout = fopen(buf, "w");
+ if (fout) {
+ out = fout;
+ }
+#else
+ fprintf(out, "Specialization stats:\n");
+#endif
+ print_stats(out, &_specialization_stats[LOAD_ATTR], "load_attr");
+ print_stats(out, &_specialization_stats[LOAD_GLOBAL], "load_global");
+ print_stats(out, &_specialization_stats[BINARY_SUBSCR], "binary_subscr");
+ if (out != stderr) {
+ fclose(out);
+ }
}
#if SPECIALIZATION_STATS_DETAILED