mirror of
https://github.com/python/cpython.git
synced 2024-11-30 21:34:17 +08:00
125 lines
3.1 KiB
C
125 lines
3.1 KiB
C
|
|
|
|
#ifndef Py_PYSTATS_H
|
|
#define Py_PYSTATS_H
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef Py_STATS
|
|
|
|
#define SPECIALIZATION_FAILURE_KINDS 36
|
|
|
|
/* Stats for determining who is calling PyEval_EvalFrame */
|
|
#define EVAL_CALL_TOTAL 0
|
|
#define EVAL_CALL_VECTOR 1
|
|
#define EVAL_CALL_GENERATOR 2
|
|
#define EVAL_CALL_LEGACY 3
|
|
#define EVAL_CALL_FUNCTION_VECTORCALL 4
|
|
#define EVAL_CALL_BUILD_CLASS 5
|
|
#define EVAL_CALL_SLOT 6
|
|
#define EVAL_CALL_FUNCTION_EX 7
|
|
#define EVAL_CALL_API 8
|
|
#define EVAL_CALL_METHOD 9
|
|
|
|
#define EVAL_CALL_KINDS 10
|
|
|
|
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;
|
|
uint64_t eval_calls[EVAL_CALL_KINDS];
|
|
} CallStats;
|
|
|
|
typedef struct _object_stats {
|
|
uint64_t increfs;
|
|
uint64_t decrefs;
|
|
uint64_t interpreter_increfs;
|
|
uint64_t interpreter_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;
|
|
uint64_t dict_dematerialized;
|
|
uint64_t type_cache_hits;
|
|
uint64_t type_cache_misses;
|
|
uint64_t type_cache_dunder_hits;
|
|
uint64_t type_cache_dunder_misses;
|
|
uint64_t type_cache_collisions;
|
|
uint64_t optimization_attempts;
|
|
uint64_t optimization_traces_created;
|
|
uint64_t optimization_traces_executed;
|
|
uint64_t optimization_uops_executed;
|
|
/* Temporary value used during GC */
|
|
uint64_t object_visits;
|
|
} ObjectStats;
|
|
|
|
typedef struct _gc_stats {
|
|
uint64_t collections;
|
|
uint64_t object_visits;
|
|
uint64_t objects_collected;
|
|
} GCStats;
|
|
|
|
typedef struct _stats {
|
|
OpcodeStats opcode_stats[256];
|
|
CallStats call_stats;
|
|
ObjectStats object_stats;
|
|
GCStats *gc_stats;
|
|
} PyStats;
|
|
|
|
|
|
PyAPI_DATA(PyStats) _py_stats_struct;
|
|
PyAPI_DATA(PyStats *) _py_stats;
|
|
|
|
extern void _Py_StatsClear(void);
|
|
extern void _Py_PrintSpecializationStats(int to_file);
|
|
|
|
#ifdef _PY_INTERPRETER
|
|
|
|
#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_increfs++; } while (0)
|
|
#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.interpreter_decrefs++; } while (0)
|
|
|
|
#else
|
|
|
|
#define _Py_INCREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.increfs++; } while (0)
|
|
#define _Py_DECREF_STAT_INC() do { if (_py_stats) _py_stats->object_stats.decrefs++; } while (0)
|
|
|
|
#endif
|
|
|
|
#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 */
|