JSON support for annotate
Adds support for JSON with the annotate feature along with proper adjustments to sampling schema.
Result of running --annotate --json
for python_d.exe
example
{
"sampling": {
"sample_display_row": 50,
"samples_generated": 129,
"samples_dropped": 1,
"ld_spec": {
"samples": [{
"overhead": 82.0312,
"count": 105,
"symbol": "x_mul:python313_d.dll"
}, {
"overhead": 3.125,
"count": 4,
"symbol": "v_isub:python313_d.dll"
}, {
"overhead": 2.34375,
"count": 3,
"symbol": "_Py_atomic_load_32bit_impl:python313_d.dll"
}, {
"overhead": 2.34375,
"count": 3,
"symbol": "_Py_ThreadCanHandleSignals:python313_d.dll"
}, {
"overhead": 1.5625,
"count": 2,
"symbol": "read_size_t:python313_d.dll"
}, {
"overhead": 1.5625,
"count": 2,
"symbol": "v_iadd:python313_d.dll"
}, {
"overhead": 1.5625,
"count": 2,
"symbol": "x_add:python313_d.dll"
}, {
"overhead": 1.5625,
"count": 2,
"symbol": "unknown"
}, {
"overhead": 0.78125,
"count": 1,
"symbol": "pymalloc_free:python313_d.dll"
}, {
"overhead": 0.78125,
"count": 1,
"symbol": "_PyObject_Free:python313_d.dll"
}, {
"overhead": 0.78125,
"count": 1,
"symbol": "PyErr_CheckSignals:python313_d.dll"
}, {
"overhead": 0.78125,
"count": 1,
"symbol": "_PyMem_DebugCheckAddress:python313_d.dll"
}, {
"overhead": 0.78125,
"count": 1,
"symbol": "_PyLong_DigitCount:python313_d.dll"
}],
"interval": 100000,
"printed_sample_num": 13,
"annotate": [{
"function_name": "x_mul:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3559,
"hits": 48
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3560,
"hits": 16
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3561,
"hits": 15
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3558,
"hits": 9
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3562,
"hits": 9
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3563,
"hits": 4
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3564,
"hits": 2
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3550,
"hits": 1
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3551,
"hits": 1
}]
},
{
"function_name": "v_isub:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 1546,
"hits": 2
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 1549,
"hits": 2
}]
},
{
"function_name": "_Py_atomic_load_32bit_impl:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_atomic.h",
"line_number": 470,
"hits": 1
}, {
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_atomic.h",
"line_number": 486,
"hits": 1
}, {
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_atomic.h",
"line_number": 492,
"hits": 1
}]
},
{
"function_name": "_Py_ThreadCanHandleSignals:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_pystate.h",
"line_number": 59,
"hits": 2
}, {
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_pystate.h",
"line_number": 58,
"hits": 1
}]
},
{
"function_name": "read_size_t:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/obmalloc.c",
"line_number": 1892,
"hits": 2
}]
},
{
"function_name": "v_iadd:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 1520,
"hits": 2
}]
},
{
"function_name": "x_add:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3370,
"hits": 1
}, {
"filename": "C:/Users/evert/source/repos/cpython/Objects/longobject.c",
"line_number": 3371,
"hits": 1
}]
},
{
"function_name": "pymalloc_free:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/obmalloc.c",
"line_number": 1671,
"hits": 1
}]
},
{
"function_name": "_PyObject_Free:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/obmalloc.c",
"line_number": 1725,
"hits": 1
}]
},
{
"function_name": "PyErr_CheckSignals:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Modules/signalmodule.c",
"line_number": 1760,
"hits": 1
}]
},
{
"function_name": "_PyMem_DebugCheckAddress:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Objects/obmalloc.c",
"line_number": 2213,
"hits": 1
}]
},
{
"function_name": "_PyLong_DigitCount:python313_d.dll",
"source_code": [{
"filename": "C:/Users/evert/source/repos/cpython/Include/internal/pycore_long.h",
"line_number": 177,
"hits": 1
}]
}
]
}
}
}
Result of running --annotate --json
for main.exe
example
{
"sampling": {
"sample_display_row": 50,
"samples_generated": 3113,
"samples_dropped": 41,
"inst_spec": {
"samples": [{
"overhead": 99.8242,
"count": 2271,
"symbol": "simd_hot"
}, {
"overhead": 0.131868,
"count": 3,
"symbol": "df_hot"
}, {
"overhead": 0.043956,
"count": 1,
"symbol": "main"
}],
"interval": 10000,
"printed_sample_num": 3,
"annotate": [{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 841
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 22,
"hits": 1
}]
},
{
"function_name": "df_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 8,
"hits": 1
}]
},
{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 2271
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 22,
"hits": 1
}]
},
{
"function_name": "df_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 8,
"hits": 2
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 6,
"hits": 1
}]
},
{
"function_name": "main",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/main.c",
"line_number": 23,
"hits": 1
}]
}
]
},
"l1d_cache": {
"samples": [{
"overhead": 99.8814,
"count": 842,
"symbol": "simd_hot"
}, {
"overhead": 0.118624,
"count": 1,
"symbol": "df_hot"
}],
"interval": 10000,
"printed_sample_num": 2,
"annotate": [{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 841
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 22,
"hits": 1
}]
},
{
"function_name": "df_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 8,
"hits": 1
}]
}
]
},
"vfp_spec": {
"samples": [{
"overhead": 100,
"count": 50,
"symbol": "simd_hot"
}],
"interval": 10000,
"printed_sample_num": 1,
"annotate": [{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 841
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 22,
"hits": 1
}]
},
{
"function_name": "df_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 8,
"hits": 1
}]
},
{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 2271
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 22,
"hits": 1
}]
},
{
"function_name": "df_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 8,
"hits": 2
}, {
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 6,
"hits": 1
}]
},
{
"function_name": "main",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/main.c",
"line_number": 23,
"hits": 1
}]
},
{
"function_name": "simd_hot",
"source_code": [{
"filename": "C:/Users/przemek/Desktop/wperf/merge-retquest/94/lib.c",
"line_number": 23,
"hits": 50
}]
}
]
}
}
}
PS. Here \
was changed to /
.
Test results
============================= test session starts =============================
platform win32 -- Python 3.10.3, pytest-7.2.1, pluggy-1.0.0
rootdir: C:\Users\everton\wperf-scripts
collected 104 items
tests\wperf_cli_common_test.py .... [ 3%]
tests\wperf_cli_config_test.py ..... [ 8%]
tests\wperf_cli_extra_events_test.py .... [ 12%]
tests\wperf_cli_json_validator_test.py .... [ 16%]
tests\wperf_cli_list_test.py ..... [ 21%]
tests\wperf_cli_metrics_test.py ..s....sssssssss [ 36%]
tests\wperf_cli_padding_test.py ........... [ 47%]
tests\wperf_cli_stat_test.py ........................................... [ 88%]
[ 88%]
tests\wperf_cli_test_test.py ..... [ 93%]
tests\wperf_cli_timeline_test.py ...... [ 99%]
tests\wperf_lib_app_test.py s [100%]
================= 93 passed, 11 skipped in 136.11s (0:02:16) ==================