Skip to content

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) ==================

Merge request reports

Loading