diff options
author | Mark Shannon <mark@hotpy.org> | 2022-05-16 13:35:11 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-16 13:35:11 (GMT) |
commit | fa2b8b75eb2b8a0193d587e02b488a73579118fc (patch) | |
tree | 023f4ceed47906c30c68348c032a38707ec5516f /Include/pystats.h | |
parent | f6fd8aac13714ce17650eb4a648d5c08f0be53b4 (diff) | |
download | cpython-fa2b8b75eb2b8a0193d587e02b488a73579118fc.zip cpython-fa2b8b75eb2b8a0193d587e02b488a73579118fc.tar.gz cpython-fa2b8b75eb2b8a0193d587e02b488a73579118fc.tar.bz2 |
Improve object stats (#92845)
* Add incref/decref stats
* Show ratios for allocation in summary
Diffstat (limited to 'Include/pystats.h')
-rw-r--r-- | Include/pystats.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Include/pystats.h b/Include/pystats.h new file mode 100644 index 0000000..bc05dd8 --- /dev/null +++ b/Include/pystats.h @@ -0,0 +1,77 @@ + + +#ifndef Py_PYSTATS_H +#define Py_PYSTATS_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef Py_STATS + +#define SPECIALIZATION_FAILURE_KINDS 32 + +typedef struct _specialization_stats { + uint64_t success; + uint64_t failure; + uint64_t hit; + uint64_t deferred; + uint64_t miss; + uint64_t deopt; + uint64_t failure_kinds[SPECIALIZATION_FAILURE_KINDS]; +} SpecializationStats; + +typedef struct _opcode_stats { + SpecializationStats specialization; + uint64_t execution_count; + uint64_t pair_count[256]; +} OpcodeStats; + +typedef struct _call_stats { + uint64_t inlined_py_calls; + uint64_t pyeval_calls; + uint64_t frames_pushed; + uint64_t frame_objects_created; +} CallStats; + +typedef struct _object_stats { + uint64_t increfs; + uint64_t decrefs; + uint64_t allocations; + uint64_t allocations512; + uint64_t allocations4k; + uint64_t allocations_big; + uint64_t frees; + uint64_t to_freelist; + uint64_t from_freelist; + uint64_t new_values; + uint64_t dict_materialized_on_request; + uint64_t dict_materialized_new_key; + uint64_t dict_materialized_too_big; + uint64_t dict_materialized_str_subclass; +} ObjectStats; + +typedef struct _stats { + OpcodeStats opcode_stats[256]; + CallStats call_stats; + ObjectStats object_stats; +} PyStats; + +PyAPI_DATA(PyStats) _py_stats; + +extern void _Py_PrintSpecializationStats(int to_file); + + +#define _Py_INCREF_STAT_INC() _py_stats.object_stats.increfs++ +#define _Py_DECREF_STAT_INC() _py_stats.object_stats.decrefs++ + +#else + +#define _Py_INCREF_STAT_INC() ((void)0) +#define _Py_DECREF_STAT_INC() ((void)0) + +#endif // !Py_STATS + +#ifdef __cplusplus +} +#endif +#endif /* !Py_PYSTATs_H */ |