Open mdboom opened 1 year ago
Would it be hard to have a graph with % time, to make it easier to compare benchmarks?
Would it be hard to have a graph with % time, to make it easier to compare benchmarks?
You mean, for a particular benchmark, graph the % time spent in each function so you could compare two runs of the same benchmark side-by-side and see if something improved or regressed?
I mean take the graph you already posted and stretch each row until they are the same length (ergo percent instead of time).
Ah, got it. That graph is in percentage of runtime, but the extra space on the right for each bar is "all other functions that don't make up the top 10 over all benchmarks". For example, the json
benchmarks spend a lot of time in functions in the json
C extension, but those aren't common in the benchmarks overall, so there's a lot of whitespace at the end -- you can see that from the table. Admittedly, it's not the greatest plot -- I can't really show all of the time in each benchmark because you quickly run out of easy-distinguishable colors. Maybe if I get some sort of tooltip working, you could hover over a bar to see the function name and then we wouldn't have to rely on colors for those "long tail" functions.
(I've edited the plot above to make this more obvious).
What might be useful is to group the functions into categories:
_PyEval_EvalFrameDefault
_Py_dict_lookup
, unicodekeys_lookup_unicode
, _PyTpe_Lookup
(but not __nss_database_lookup
)gc_collect_main
, Any function with visit
or traverse
in the name._PyObject_Malloc
and _PyObject_Free
, plus PyMem
variants. Anything ending in dealloc
.(I've edited the plot above to make this more obvious).
Thanks! That solved it.
At @markshannon's suggestion, here's what grouping looks like. The boundaries between categories are a bit messy, but I also didn't want to have too many. You can see which functions map to which categories in the tables below.
<!DOCTYPE html>
10.39% | python | _PyErr_SetObject.part.0 | exceptions
-- | -- | -- | --
That's properly crazy. I'll look into it.
That's properly crazy.
Maybe not. That's the "async generators" benchmark.
Async iterators always raise StopAsyncIteration
to return. We are able to skip literally raising StopIteration
for normal iterators in lots of cases, but I'm pretty sure async generators never got the same treatment. This seems confirmed by the other functions present in the 1-2% range for that benchmark (PyErr_ExceptionMatches
, _PyErr_Restore
, _PyGen_SetStopIterationValue
, _PyGen_FetchStopIterationValue
, and StopIteration_dealloc
).
<!DOCTYPE html> 10.39% | python | _PyErr_SetObject.part.0 | exceptions -- | -- | -- | --
That's properly crazy. I'll look into it.
Why do we need to normalise and chain the StopIteration? I think we could do:
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 6316fa9865..e999718021 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -627,8 +627,9 @@ _PyGen_SetStopIterationValue(PyObject *value)
if (e == NULL) {
return -1;
}
- PyErr_SetObject(PyExc_StopIteration, e);
- Py_DECREF(e);
+ PyErr_SetRaisedException(e);
return 0;
}
I ran the benchmarks on this but there was some problem with the baseline: https://github.com/faster-cpython/benchmarking/actions/runs/4632788258
Despite the "except" in the name, _PyFrame_ClearExceptCode
belongs in the "interpreter" category. It clears evaluation frames.
There are a lot of functions in the "other" category, that don't belong there. I think we're going to have to manually classify the top 100 or so functions.
The tricky part is functions that depend on context. E.g. dict operations are "lookup" if called from a lookup function, but "library" if called as part of an explicit dictionary operation. We could just classify them as "ambiguous" for now.
Here's a revised list of classifications:
_PyEval_EvalFrameDefault
, _PyFrame_ClearExceptCode
, _PyThreadState_PopFrame
, _PyEvalFramePushAndInit
_Py_dict_lookup
, unicodekeys_lookup_unicode
, _PyType_Lookup
(but not __nss_database_lookup
)gc_collect_main
, Any function with visit
or traverse
in the name._PyObject_Malloc
and _PyObject_Free
, plus PyMem
variants. Anything ending in [de]alloc
.PyObject_XXX
, type_xxx
, that aren't [de]allocation functions, PyNumber_xxx
(this is stuff we could be specializing, but aren't)_Py_dict_lookup
I ran the benchmarks on this but there was some problem with the baseline: https://github.com/faster-cpython/benchmarking/actions/runs/4632788258
Yeah, it's some weird corner case where git says the base commit is the same commit. Not sure why it's happening: https://github.com/faster-cpython/benchmarking/issues/127
I think this is close enough to merge and we can iterate on function classification.
The latest table and plot are now published to the repo using Mark's categories. These new results also display the total percentage for each category.
"Unclassified" functions currently make up 8.59% of the total, but each function within that is pretty low. Eyeballing this, I think categories of "numeric" (int/float/math), "collections" (list/dict/tuple/set), and "strings" (str/bytes) might make sense, but I don't know if that's useful in terms of going after performance opportunities.
@markshannon: Does ambiguous make sense as its own category (or should we just leave it as unclassified)?
Here is the code that classifies functions.
I ran the benchmarks on this but there was some problem with the baseline: https://github.com/faster-cpython/benchmarking/actions/runs/4632788258
Yeah, it's some weird corner case where git says the base commit is the same commit. Not sure why it's happening: faster-cpython/benchmarking#127
I think I already had a branch with the same name in my fork, which has been merged, so I wasn't running on what I thought I was running. Will try again.
@markshannon, @mdboom, here's a quick-and-dirty attempt to assign as many of the "unknown"s as possible to the most impactful individual builtin types. I got them from the list of unknowns from https://github.com/faster-cpython/benchmarking-public/blob/main/profiling/profiling.md.
It's not perfect, of course, but I think it helps make a dent in the "gray". Possible other ways of interpreting these:
Thanks, @brandtbucher. I'll add these to the regular expressions and rerun the graphs.
Updates to the regular expression and a regenerated plot are available here: https://github.com/faster-cpython/benchmarking/pull/143
Cc @brandtbucher, @markshannon
This is the results of the first run of running the Linux perf profiler on a per-benchmark basis. Rather than retaining call stacks and producing flame graphs etc, it was decided to just do the simplest thing and time the amount spent in each function (the "self" time, excluding "children"), regardless of call stacks.
A few notes:
__nss_database_lookup
is reported, that could be any non-exported symbol in libc. See this stackoverflow explanation. I'm going to try the suggestion to install the debug symbols for libc and re-run to see if that helps, but for now, just read that as "something" (or multiple things) in libc.Top 10 functions in each benchmark above 1% contribution
## 2to3 | percentage | object | symbol | | ---: | :--- | :--- | | 27.10% | `python` | `_PyEval_EvalFrameDefault` | | 3.58% | `python` | `gc_collect_main` | | 3.38% | `python` | `unicodekeys_lookup_unicode` | | 2.51% | `python` | `_PyObject_Malloc (inlined)` | | 1.82% | `python` | `_PyObject_Free` | | 1.76% | `python` | `_Py_dict_lookup` | | 1.73% | `libc-2.31.so` | `__nss_database_lookup` | | 1.68% | `python` | `sre_ucs1_match` | | 1.62% | `python` | `tupledealloc` | | 1.46% | `python` | `_PyType_Lookup` | | 1.34% | `python` | `visit_decref` | ## aiohttp | percentage | object | symbol | | ---: | :--- | :--- | | 25.77% | `python` | `_PyEval_EvalFrameDefault` | | 2.47% | `python` | `unicodekeys_lookup_unicode` | | 2.29% | `libc-2.31.so` | `__nss_database_lookup` | | 2.03% | `python` | `_PyObject_Malloc` | | 1.87% | `python` | `_PyObject_Free` | | 1.60% | `python` | `_PyFrame_ClearExceptCode` | | 1.52% | `python` | `initialize_locals` | | 1.39% | `python` | `gc_collect_main` | | 1.16% | `python` | `_Py_dict_lookup` | | 1.15% | `python` | `tupledealloc` | | 1.00% | `python` | `_PyType_Lookup` | ## async_generators | percentage | object | symbol | | ---: | :--- | :--- | | 22.58% | `python` | `_PyEval_EvalFrameDefault` | | 10.39% | `python` | `_PyErr_SetObject.part.0` | | 3.11% | `python` | `_PyObject_Free` | | 3.01% | `python` | `async_gen_asend_iternext` | | 2.58% | `python` | `_PyObject_Malloc` | | 2.54% | `python` | `PyType_GenericAlloc` | | 2.38% | `python` | `tupledealloc` | | 2.22% | `python` | `gc_collect_main` | | 2.01% | `libc-2.31.so` | `__nss_database_lookup` | | 1.91% | `python` | `async_gen_anext` | | 1.85% | `python` | `PyErr_ExceptionMatches` | ## async_tree | percentage | object | symbol | | ---: | :--- | :--- | | 26.24% | `python` | `gc_collect_main` | | 18.06% | `python` | `_PyEval_EvalFrameDefault` | | 6.94% | `python` | `visit_reachable` | | 6.63% | `python` | `visit_decref` | | 2.02% | `python` | `_PyObject_Malloc` | | 1.49% | `python` | `_PyObject_Free` | | 1.21% | `python` | `subtype_traverse` | | 1.04% | `python` | `initialize_locals` | ## async_tree_cpu_io_mixed | percentage | object | symbol | | ---: | :--- | :--- | | 18.84% | `python` | `gc_collect_main` | | 16.08% | `python` | `k_mul` | | 14.60% | `python` | `_PyEval_EvalFrameDefault` | | 4.84% | `python` | `visit_reachable` | | 4.60% | `python` | `visit_decref` | | 2.79% | `python` | `_PyObject_Malloc` | | 2.22% | `python` | `_PyObject_Free` | | 1.31% | `python` | `PyErr_CheckSignals` | | 1.22% | `math.cpython-312-x86_64-linux-gnu.so` | `factorial_partial_product` | ## async_tree_io | percentage | object | symbol | | ---: | :--- | :--- | | 33.95% | `python` | `gc_collect_main` | | 16.74% | `python` | `_PyEval_EvalFrameDefault` | | 8.03% | `python` | `visit_reachable` | | 7.21% | `python` | `visit_decref` | | 1.66% | `python` | `_PyObject_Malloc` | | 1.29% | `python` | `subtype_traverse` | | 1.21% | `python` | `_PyObject_Free` | | 1.04% | `python` | `initialize_locals` | ## async_tree_memoization | percentage | object | symbol | | ---: | :--- | :--- | | 25.84% | `python` | `gc_collect_main` | | 19.07% | `python` | `_PyEval_EvalFrameDefault` | | 6.66% | `python` | `visit_reachable` | | 6.52% | `python` | `visit_decref` | | 2.00% | `python` | `_PyObject_Malloc` | | 1.58% | `python` | `_PyObject_Free` | | 1.17% | `python` | `_PyFrame_ClearExceptCode` | | 1.11% | `python` | `subtype_traverse` | | 1.05% | `python` | `unicodekeys_lookup_unicode` | ## asyncio_tcp | percentage | object | symbol | | ---: | :--- | :--- | | 32.63% | `[kernel.kallsyms]` | `copy_user_enhanced_fast_string` | | 16.73% | `libc-2.31.so` | `__nss_database_lookup` | | 9.28% | `python` | `_PyEval_EvalFrameDefault` | | 8.16% | `[kernel.kallsyms]` | `clear_page_erms` | ## chameleon | percentage | object | symbol | | ---: | :--- | :--- | | 40.74% | `python` | `_PyEval_EvalFrameDefault` | | 3.16% | `python` | `_PyObject_Malloc` | | 3.09% | `python` | `unicodekeys_lookup_unicode` | | 2.73% | `python` | `_PyObject_Free` | | 2.08% | `python` | `_Py_dict_lookup` | | 2.04% | `libc-2.31.so` | `__nss_database_lookup` | | 1.93% | `python` | `sre_ucs2_charset.isra.0` | | 1.66% | `python` | `_PyFrame_ClearExceptCode` | | 1.65% | `python` | `_PyUnicode_JoinArray.part.0` | | 1.44% | `python` | `gc_collect_main` | | 1.28% | `python` | `long_to_decimal_string_internal` | ## chaos | percentage | object | symbol | | ---: | :--- | :--- | | 48.14% | `python` | `_PyEval_EvalFrameDefault` | | 2.34% | `python` | `_PyLong_Subtract` | | 1.98% | `python` | `_PyLong_Add` | | 1.82% | `python` | `_PyObject_Free` | | 1.79% | `python` | `PyType_IsSubtype` | | 1.58% | `python` | `_PyFrame_ClearExceptCode` | | 1.27% | `python` | `tupledealloc` | | 1.13% | `python` | `PyFloat_FromDouble` | | 1.04% | `python` | `initialize_locals` | | 1.02% | `python` | `_PyObject_Malloc (inlined)` | | 1.00% | `libc-2.31.so` | `__nss_database_lookup` | ## comprehensions | percentage | object | symbol | | ---: | :--- | :--- | | 32.34% | `python` | `_PyEval_EvalFrameDefault` | | 4.48% | `python` | `_Py_dict_lookup` | | 3.68% | `python` | `_PyObject_Malloc` | | 2.57% | `python` | `_PyObject_Free` | | 2.25% | `python` | `unicodekeys_lookup_unicode` | | 2.17% | `python` | `advance` | | 1.68% | `python` | `_PyFrame_ClearExceptCode` | | 1.58% | `python` | `PyFunction_NewWithQualName` | | 1.35% | `libc-2.31.so` | `__nss_database_lookup` | | 1.21% | `python` | `dict_get` | | 1.10% | `python` | `list_dealloc` | ## concurrent_imap | percentage | object | symbol | | ---: | :--- | :--- | | 14.02% | `python` | `_PyEval_EvalFrameDefault` | | 2.77% | `python` | `_PyObject_Free` | | 2.38% | `python` | `unicodekeys_lookup_unicode` | | 1.76% | `python` | `gc_collect_main` | | 1.64% | `python` | `tupledealloc` | | 1.49% | `libc-2.31.so` | `__nss_database_lookup` | | 1.32% | `python` | `_PyObject_Malloc` | | 1.31% | `python` | `initialize_locals` | | 1.21% | `python` | `_PyFrame_ClearExceptCode` | | 1.14% | `python` | `_PyEvalFramePushAndInit` | | 1.08% | `python` | `_Py_dict_lookup` | ## coroutines | percentage | object | symbol | | ---: | :--- | :--- | | 45.05% | `python` | `_PyEval_EvalFrameDefault` | | 5.99% | `python` | `gen_dealloc` | | 3.67% | `libc-2.31.so` | `__nss_database_lookup` | | 3.29% | `python` | `_PyObject_GC_NewVar` | | 3.20% | `python` | `make_gen` | | 3.19% | `python` | `_PyLong_Subtract` | | 2.69% | `python` | `_PyLong_Add` | | 2.67% | `python` | `_PyObject_Free` | | 2.12% | `python` | `_PyFrame_ClearExceptCode` | | 1.85% | `python` | `_PyObject_Malloc (inlined)` | | 1.79% | `python` | `PyObject_CallFinalizerFromDealloc` | ## coverage | percentage | object | symbol | | ---: | :--- | :--- | | 25.34% | `python` | `_PyEval_EvalFrameDefault` | | 5.74% | `tracer.cpython-312-x86_64-linux-gnu.so` | `CTracer_trace` | | 5.70% | `python` | `unicodekeys_lookup_unicode` | | 3.52% | `python` | `call_trace.part.0` | | 3.46% | `python` | `_Py_dict_lookup` | | 2.91% | `python` | `_PyObject_Malloc` | | 2.29% | `python` | `_PyObject_Free` | | 2.26% | `python` | `siphash13` | | 1.95% | `python` | `_PyType_Lookup` | | 1.68% | `libc-2.31.so` | `__nss_database_lookup` | | 1.57% | `python` | `gc_collect_main` | ## crypto_pyaes | percentage | object | symbol | | ---: | :--- | :--- | | 37.06% | `python` | `_PyEval_EvalFrameDefault` | | 6.90% | `python` | `long_bitwise` | | 4.79% | `python` | `_PyObject_Free` | | 3.87% | `python` | `long_rshift1` | | 3.83% | `python` | `_PyObject_Malloc` | | 2.69% | `python` | `PyObject_GenericGetAttr` | | 2.58% | `python` | `l_mod` | | 2.51% | `python` | `long_and` | | 2.35% | `python` | `unicodekeys_lookup_unicode` | | 1.72% | `python` | `PyLong_FromLong` | | 1.53% | `python` | `_PyLong_Add` | ## dask | percentage | object | symbol | | ---: | :--- | :--- | | 34.25% | `python` | `_PyEval_EvalFrameDefault` | | 3.85% | `python` | `gc_collect_main` | | 2.46% | `python` | `_PyObject_Malloc` | | 2.17% | `python` | `unicodekeys_lookup_unicode` | | 2.12% | `python` | `_PyObject_Free` | | 1.96% | `python` | `visit_decref` | | 1.72% | `libc-2.31.so` | `__nss_database_lookup` | | 1.65% | `python` | `_PyFrame_ClearExceptCode` | | 1.46% | `python` | `visit_reachable` | | 1.23% | `python` | `_Py_dict_lookup` | | 1.20% | `python` | `tupledealloc` | ## deepcopy | percentage | object | symbol | | ---: | :--- | :--- | | 46.42% | `python` | `_PyEval_EvalFrameDefault` | | 5.92% | `python` | `_Py_dict_lookup` | | 3.04% | `python` | `_PyFrame_ClearExceptCode` | | 2.89% | `python` | `_PyObject_Free` | | 2.37% | `python` | `_PyObject_Malloc` | | 2.03% | `python` | `dict_get` | | 1.50% | `python` | `PyLong_FromVoidPtr` | | 1.23% | `python` | `unicodekeys_lookup_unicode` | ## deltablue | percentage | object | symbol | | ---: | :--- | :--- | | 60.24% | `python` | `_PyEval_EvalFrameDefault` | | 3.06% | `python` | `_PyFrame_ClearExceptCode` | | 2.22% | `python` | `gc_collect_main` | | 1.93% | `python` | `unicodekeys_lookup_unicode` | | 1.77% | `python` | `_PyObject_Malloc` | | 1.68% | `python` | `_PyObject_GetMethod` | | 1.63% | `python` | `_PyObject_Free` | | 1.44% | `python` | `_PyType_Lookup` | | 1.08% | `python` | `visit_decref` | | 1.06% | `python` | `_PyThreadState_PopFrame` | ## django_template | percentage | object | symbol | | ---: | :--- | :--- | | 33.98% | `python` | `_PyEval_EvalFrameDefault` | | 3.33% | `python` | `unicodekeys_lookup_unicode` | | 2.82% | `python` | `_PyObject_Malloc (inlined)` | | 2.48% | `python` | `_PyObject_Free` | | 2.01% | `python` | `_PyFrame_ClearExceptCode` | | 1.96% | `python` | `gc_collect_main` | | 1.68% | `libc-2.31.so` | `__nss_database_lookup` | | 1.52% | `python` | `_Py_dict_lookup` | | 1.32% | `python` | `_PyType_Lookup` | | 1.27% | `python` | `_PyObject_GenericGetAttrWithDict` | | 1.12% | `python` | `initialize_locals` | ## djangocms | percentage | object | symbol | | ---: | :--- | :--- | | 17.57% | `python` | `_PyEval_EvalFrameDefault` | | 5.74% | `python` | `unicodekeys_lookup_unicode` | | 4.91% | `python` | `gc_collect_main` | | 2.47% | `python` | `_PyObject_Malloc` | | 2.40% | `python` | `_Py_dict_lookup` | | 2.05% | `python` | `visit_decref` | | 1.95% | `libc-2.31.so` | `__nss_database_lookup` | | 1.69% | `python` | `_PyType_Lookup` | | 1.58% | `python` | `_PyObject_Free` | | 1.56% | `python` | `visit_reachable` | ## docutils | percentage | object | symbol | | ---: | :--- | :--- | | 25.23% | `python` | `_PyEval_EvalFrameDefault` | | 7.00% | `python` | `sre_ucs1_match` | | 6.46% | `python` | `gc_collect_main` | | 3.23% | `python` | `unicodekeys_lookup_unicode` | | 2.68% | `python` | `_PyObject_Malloc` | | 2.37% | `python` | `_PyObject_Free` | | 2.30% | `python` | `visit_decref` | | 2.26% | `python` | `_PyType_Lookup` | | 2.04% | `libc-2.31.so` | `__nss_database_lookup` | | 1.69% | `python` | `sre_ucs2_charset.isra.0` | | 1.48% | `python` | `visit_reachable` | ## dulwich_log | percentage | object | symbol | | ---: | :--- | :--- | | 28.50% | `python` | `_PyEval_EvalFrameDefault` | | 2.91% | `libz.so.1.2.11` | `inflateCodesUsed` | | 2.76% | `python` | `_PyObject_Malloc` | | 2.43% | `libc-2.31.so` | `__nss_database_lookup` | | 2.20% | `python` | `_PyObject_Free` | | 1.80% | `libz.so.1.2.11` | `inflateBackEnd` | | 1.57% | `libz.so.1.2.11` | `inflate` | | 1.31% | `python` | `unicodekeys_lookup_unicode` | | 1.18% | `python` | `_PyFrame_ClearExceptCode` | | 1.15% | `python` | `gc_collect_main` | ## fannkuch | percentage | object | symbol | | ---: | :--- | :--- | | 37.68% | `python` | `_PyEval_EvalFrameDefault` | | 8.34% | `python` | `PySlice_AdjustIndices` | | 5.61% | `python` | `list_subscript` | | 5.19% | `python` | `list_ass_slice` | | 4.58% | `python` | `_PyLong_Add` | | 3.63% | `python` | `list_dealloc` | | 3.12% | `python` | `slice_dealloc` | | 2.45% | `python` | `PyNumber_AsSsize_t` | | 2.30% | `python` | `_PyEval_SliceIndex` | | 2.07% | `python` | `PySlice_Unpack` | | 1.60% | `python` | `PySlice_New` | ## float | percentage | object | symbol | | ---: | :--- | :--- | | 37.46% | `python` | `_PyEval_EvalFrameDefault` | | 4.41% | `libm-2.31.so` | `f64xsubf128` | | 3.86% | `python` | `gc_collect_main` | | 3.03% | `python` | `subtype_traverse` | | 2.88% | `python` | `visit_decref` | | 2.52% | `python` | `visit_reachable` | | 2.06% | `python` | `_PyObject_Free` | | 2.04% | `python` | `_PyObject_Malloc (inlined)` | | 2.03% | `python` | `PyFloat_FromDouble` | | 1.98% | `python` | `float_div` | | 1.82% | `python` | `subtype_dealloc` | ## gc_collect | percentage | object | symbol | | ---: | :--- | :--- | | 31.60% | `python` | `gc_collect_main` | | 14.78% | `python` | `visit_reachable` | | 14.17% | `python` | `visit_decref` | | 6.51% | `python` | `_PyEval_EvalFrameDefault` | | 5.19% | `python` | `dict_traverse` | | 1.91% | `python` | `PyObject_IS_GC` | | 1.90% | `python` | `_PyDict_MaybeUntrack` | | 1.80% | `python` | `subtype_traverse` | | 1.74% | `python` | `func_traverse` | | 1.62% | `python` | `set_traverse` | | 1.47% | `python` | `_PyObject_VisitManagedDict` | ## gc_traversal | percentage | object | symbol | | ---: | :--- | :--- | | 29.16% | `python` | `visit_reachable` | | 21.25% | `python` | `visit_decref` | | 15.38% | `python` | `list_traverse` | | 12.97% | `python` | `gc_collect_main` | | 3.73% | `python` | `_PyEval_EvalFrameDefault` | | 2.24% | `python` | `dict_traverse` | ## generators | percentage | object | symbol | | ---: | :--- | :--- | | 49.58% | `python` | `_PyEval_EvalFrameDefault` | | 4.44% | `python` | `gc_collect_main` | | 2.35% | `python` | `_PyObject_Malloc` | | 1.94% | `python` | `_PyObject_Free` | | 1.51% | `python` | `visit_reachable` | | 1.45% | `python` | `initialize_locals` | | 1.44% | `libc-2.31.so` | `__nss_database_lookup` | | 1.42% | `python` | `gen_dealloc` | | 1.38% | `python` | `visit_decref` | | 1.24% | `python` | `_PyFrame_ClearExceptCode` | | 1.18% | `python` | `_PyEvalFramePushAndInit` | ## genshi | percentage | object | symbol | | ---: | :--- | :--- | | 46.09% | `python` | `_PyEval_EvalFrameDefault` | | 2.96% | `python` | `unicodekeys_lookup_unicode` | | 2.49% | `python` | `_PyObject_Free` | | 2.40% | `python` | `_PyObject_Malloc` | | 2.35% | `python` | `_Py_dict_lookup` | | 1.43% | `python` | `insertdict` | | 1.36% | `python` | `_PyFrame_ClearExceptCode` | | 1.30% | `python` | `_PyType_Lookup` | | 1.23% | `python` | `insert_to_emptydict` | | 1.13% | `python` | `tupledealloc` | | 1.05% | `libc-2.31.so` | `__nss_database_lookup` | ## go | percentage | object | symbol | | ---: | :--- | :--- | | 65.16% | `python` | `_PyEval_EvalFrameDefault` | | 2.17% | `python` | `_PyFrame_ClearExceptCode` | | 2.00% | `python` | `unicodekeys_lookup_unicode` | | 1.54% | `python` | `_PyObject_GetMethod` | | 1.25% | `python` | `_PyObject_Free` | | 1.07% | `python` | `_Py_dict_lookup` | | 1.05% | `python` | `_PyType_Lookup` | | 1.04% | `python` | `_PyObject_Malloc (inlined)` | ## gunicorn | percentage | object | symbol | | ---: | :--- | :--- | | 27.12% | `python` | `_PyEval_EvalFrameDefault` | | 2.84% | `python` | `unicodekeys_lookup_unicode` | | 2.22% | `python` | `_PyObject_Malloc` | | 2.20% | `libc-2.31.so` | `__nss_database_lookup` | | 1.92% | `python` | `_PyObject_Free` | | 1.65% | `python` | `gc_collect_main` | | 1.53% | `python` | `_PyFrame_ClearExceptCode` | | 1.37% | `python` | `initialize_locals` | | 1.23% | `python` | `_Py_dict_lookup` | | 1.20% | `python` | `tupledealloc` | ## hexiom | percentage | object | symbol | | ---: | :--- | :--- | | 56.30% | `python` | `_PyEval_EvalFrameDefault` | | 2.38% | `python` | `long_richcompare` | | 2.34% | `python` | `list_contains` | | 2.32% | `python` | `PyObject_RichCompare` | | 2.17% | `python` | `_PyFrame_ClearExceptCode` | | 1.56% | `python` | `PyObject_RichCompareBool` | | 1.54% | `python` | `_PyObject_Free` | | 1.36% | `python` | `unicodekeys_lookup_unicode` | | 1.33% | `python` | `PyLong_FromSsize_t` | | 1.23% | `python` | `gen_iternext` | | 1.23% | `libc-2.31.so` | `__nss_database_lookup` | ## html5lib | percentage | object | symbol | | ---: | :--- | :--- | | 36.39% | `python` | `_PyEval_EvalFrameDefault` | | 6.32% | `python` | `sre_ucs2_charset.isra.0` | | 3.48% | `python` | `gc_collect_main` | | 2.34% | `python` | `unicodekeys_lookup_unicode` | | 1.98% | `python` | `_PyObject_Malloc` | | 1.77% | `python` | `_Py_dict_lookup` | | 1.76% | `python` | `_PyObject_Free` | | 1.46% | `libc-2.31.so` | `__nss_database_lookup` | | 1.19% | `python` | `visit_decref` | | 1.12% | `python` | `_PyFrame_ClearExceptCode` | ## json | percentage | object | symbol | | ---: | :--- | :--- | | 12.00% | `_json.cpython-312-x86_64-linux-gnu.so` | `scanstring_unicode` | | 7.81% | `python` | `_PyEval_EvalFrameDefault` | | 6.49% | `_json.cpython-312-x86_64-linux-gnu.so` | `scan_once_unicode` | | 6.01% | `python` | `siphash13` | | 5.14% | `python` | `unicodekeys_lookup_unicode` | | 5.06% | `python` | `_PyObject_Malloc` | | 3.73% | `python` | `PyDict_SetDefault` | | 3.63% | `python` | `_PyObject_Free` | | 3.03% | `python` | `PyLong_FromString` | | 2.64% | `python` | `insertdict` | | 2.45% | `python` | `_Py_dict_lookup` | ## json_dumps | percentage | object | symbol | | ---: | :--- | :--- | | 13.07% | `python` | `_PyEval_EvalFrameDefault` | | 8.34% | `_json.cpython-312-x86_64-linux-gnu.so` | `py_encode_basestring_ascii` | | 4.86% | `python` | `_PyObject_Malloc` | | 4.67% | `python` | `_PyObject_Free` | | 4.36% | `python` | `_copy_characters.part.0.constprop.0` | | 3.79% | `python` | `_PyUnicodeWriter_WriteStr` | | 3.25% | `_json.cpython-312-x86_64-linux-gnu.so` | `encoder_listencode_obj` | | 2.89% | `python` | `_Py_dict_lookup` | | 2.86% | `python` | `resize_compact` | | 2.86% | `libc-2.31.so` | `__nss_database_lookup` | | 2.57% | `python` | `unicodekeys_lookup_unicode` | ## json_loads | percentage | object | symbol | | ---: | :--- | :--- | | 13.10% | `_json.cpython-312-x86_64-linux-gnu.so` | `scanstring_unicode` | | 7.15% | `_json.cpython-312-x86_64-linux-gnu.so` | `scan_once_unicode` | | 6.98% | `python` | `siphash13` | | 6.74% | `python` | `unicodekeys_lookup_unicode` | | 5.60% | `python` | `_PyEval_EvalFrameDefault` | | 4.95% | `python` | `_PyObject_Malloc` | | 3.58% | `python` | `_PyObject_Free` | | 3.40% | `python` | `_Py_dict_lookup` | | 3.20% | `python` | `insertdict` | | 3.11% | `python` | `PyLong_FromString` | | 3.06% | `libc-2.31.so` | `__nss_database_lookup` | ## logging | percentage | object | symbol | | ---: | :--- | :--- | | 46.86% | `python` | `_PyEval_EvalFrameDefault` | | 3.54% | `python` | `_PyFrame_ClearExceptCode` | | 2.00% | `python` | `_Py_dict_lookup` | | 1.93% | `python` | `initialize_locals` | | 1.78% | `python` | `dict_dealloc` | | 1.78% | `python` | `advance` | | 1.71% | `libc-2.31.so` | `__nss_database_lookup` | | 1.62% | `python` | `_PyObject_Malloc (inlined)` | | 1.56% | `python` | `_PyObject_Free` | | 1.30% | `python` | `_PyEvalFramePushAndInit` | | 1.18% | `python` | `unicodekeys_lookup_unicode` | ## mako | percentage | object | symbol | | ---: | :--- | :--- | | 37.34% | `python` | `_PyEval_EvalFrameDefault` | | 8.02% | `python` | `replace` | | 5.03% | `python` | `long_to_decimal_string_internal` | | 3.93% | `python` | `_PyUnicode_JoinArray.part.0` | | 3.28% | `python` | `_PyObject_Free` | | 2.82% | `python` | `deque_append` | | 2.48% | `libc-2.31.so` | `__nss_database_lookup` | | 1.89% | `python` | `_PyObject_Malloc` | | 1.88% | `python` | `unicode_replace` | | 1.83% | `python` | `dequeiter_next` | | 1.41% | `python` | `list_extend` | ## mdp | percentage | object | symbol | | ---: | :--- | :--- | | 28.11% | `python` | `tuplehash` | | 15.59% | `python` | `_PyEval_EvalFrameDefault` | | 13.94% | `python` | `PyObject_Hash` | | 11.14% | `python` | `long_hash` | | 5.99% | `python` | `_Py_dict_lookup` | | 2.04% | `python` | `tuplerichcompare` | | 1.41% | `python` | `PyObject_RichCompareBool` | | 1.33% | `python` | `PyObject_RichCompare` | | 1.16% | `python` | `_PyObject_Free` | | 1.15% | `python` | `dict_subscript` | | 1.05% | `python` | `_PyObject_Malloc` | ## meteor_contest | percentage | object | symbol | | ---: | :--- | :--- | | 21.41% | `python` | `_PyEval_EvalFrameDefault` | | 8.21% | `python` | `set_issubset` | | 7.68% | `python` | `set_lookkey` | | 5.81% | `python` | `setiter_iternext` | | 3.49% | `python` | `set_difference` | | 3.26% | `python` | `set_dealloc` | | 2.37% | `python` | `PyObject_RichCompare` | | 2.07% | `python` | `_PyObject_Free` | | 1.92% | `python` | `set_add_entry` | | 1.90% | `python` | `list_dealloc` | | 1.81% | `python` | `_PyObject_Malloc` | ## mypy2 | percentage | object | symbol | | ---: | :--- | :--- | | 29.20% | `python` | `_PyEval_EvalFrameDefault` | | 13.85% | `python` | `gc_collect_main` | | 2.73% | `python` | `unicodekeys_lookup_unicode` | | 2.67% | `python` | `_PyObject_Malloc` | | 2.51% | `python` | `visit_decref` | | 1.98% | `python` | `_PyObject_Free` | | 1.92% | `python` | `_PyFrame_ClearExceptCode` | | 1.57% | `python` | `_Py_dict_lookup` | | 1.56% | `python` | `initialize_locals` | | 1.39% | `python` | `_PyType_Lookup` | | 1.33% | `libc-2.31.so` | `__nss_database_lookup` | ## nbody | percentage | object | symbol | | ---: | :--- | :--- | | 68.08% | `python` | `_PyEval_EvalFrameDefault` | | 6.42% | `python` | `PyFloat_FromDouble` | | 4.31% | `libm-2.31.so` | `f64xsubf128` | | 2.40% | `python` | `float_dealloc` | | 2.26% | `python` | `_Py_NewReference` | | 1.30% | `python` | `float_pow` | ## nqueens | percentage | object | symbol | | ---: | :--- | :--- | | 37.32% | `python` | `_PyEval_EvalFrameDefault` | | 4.69% | `python` | `_PyObject_Malloc (inlined)` | | 3.50% | `python` | `_PyObject_Free` | | 2.13% | `python` | `gen_iternext` | | 2.11% | `python` | `set_add_entry` | | 1.92% | `python` | `PySlice_AdjustIndices` | | 1.70% | `python` | `_PyLong_Add` | | 1.62% | `python` | `list_dealloc` | | 1.49% | `python` | `tupledealloc` | | 1.34% | `libc-2.31.so` | `__nss_database_lookup` | | 1.33% | `python` | `set_dealloc` | ## pathlib | percentage | object | symbol | | ---: | :--- | :--- | | 18.07% | `python` | `_PyEval_EvalFrameDefault` | | 3.76% | `python` | `_PyObject_Malloc` | | 3.35% | `python` | `_PyObject_Free` | | 1.65% | `libc-2.31.so` | `__nss_database_lookup` | | 1.58% | `python` | `unicodekeys_lookup_unicode` | | 1.50% | `python` | `_PyFrame_ClearExceptCode` | | 1.46% | `[kernel.kallsyms]` | `__d_lookup_rcu` | | 1.21% | `python` | `initialize_locals` | | 1.20% | `libpthread-2.31.so` | `__pthread_mutex_lock` | | 1.14% | `[kernel.kallsyms]` | `__ext4fs_dirhash` | | 1.13% | `[kernel.kallsyms]` | `memset_erms` | ## pickle | percentage | object | symbol | | ---: | :--- | :--- | | 26.17% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `save` | | 9.04% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write` | | 7.60% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `PyMemoTable_Set` | | 4.32% | `python` | `_PyEval_EvalFrameDefault` | | 4.32% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `Pickler_clear` | | 3.87% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `memo_put.isra.0` | | 3.75% | `libc-2.31.so` | `__nss_database_lookup` | | 3.14% | `python` | `PyDict_Next` | | 2.79% | `python` | `PyUnicode_AsUTF8AndSize` | | 2.43% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write.constprop.3` | | 1.65% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `memo_get.isra.0` | ## pickle_dict | percentage | object | symbol | | ---: | :--- | :--- | | 45.53% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `save` | | 12.01% | `python` | `PyDict_Next` | | 7.67% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write` | | 6.92% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write.constprop.3` | | 4.16% | `python` | `PyLong_AsLongAndOverflow` | | 3.12% | `python` | `_PyEval_EvalFrameDefault` | | 2.07% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `PyMemoTable_Set` | | 1.44% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `Pickler_clear` | ## pickle_list | percentage | object | symbol | | ---: | :--- | :--- | | 49.69% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `save` | | 10.32% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write` | | 4.70% | `python` | `PyLong_AsLongAndOverflow` | | 4.70% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `_Pickler_Write.constprop.3` | | 4.52% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `PyMemoTable_Set` | | 2.94% | `python` | `_PyEval_EvalFrameDefault` | | 2.40% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `Pickler_clear` | | 1.69% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `memo_put.isra.0` | | 1.66% | `libc-2.31.so` | `__nss_database_lookup` | | 1.47% | `libc-2.31.so` | `pthread_attr_setschedparam` | | 1.03% | `_pickle.cpython-312-x86_64-linux-gnu.so` | `0x0000000000005cc4` | ## pickle_pure_python | percentage | object | symbol | | ---: | :--- | :--- | | 42.49% | `python` | `_PyEval_EvalFrameDefault` | | 3.82% | `python` | `_Py_dict_lookup` | | 2.72% | `python` | `_PyFrame_ClearExceptCode` | | 2.69% | `python` | `_PyObject_Malloc` | | 2.42% | `python` | `_PyObject_Free` | | 2.30% | `python` | `unicodekeys_lookup_unicode` | | 1.70% | `libc-2.31.so` | `__nss_database_lookup` | | 1.19% | `python` | `initialize_locals` | | 1.13% | `python` | `gc_collect_main` | ## pidigits | percentage | object | symbol | | ---: | :--- | :--- | | 35.94% | `python` | `x_divrem` | | 23.00% | `python` | `k_mul` | | 11.49% | `python` | `x_add` | | 7.46% | `python` | `x_sub` | | 4.15% | `python` | `_PyEval_EvalFrameDefault` | | 2.42% | `libc-2.31.so` | `pthread_attr_setschedparam` | | 1.64% | `libc-2.31.so` | `__nss_database_lookup` | ## pprint | percentage | object | symbol | | ---: | :--- | :--- | | 43.67% | `python` | `_PyEval_EvalFrameDefault` | | 3.51% | `python` | `_PyFrame_ClearExceptCode` | | 3.05% | `python` | `_PyObject_Malloc` | | 3.02% | `python` | `_PyObject_Free` | | 2.31% | `python` | `_PyType_Lookup` | | 1.85% | `libc-2.31.so` | `__nss_database_lookup` | | 1.84% | `python` | `tupledealloc` | | 1.42% | `python` | `_PyUnicode_JoinArray.part.0` | | 1.38% | `python` | `_Py_dict_lookup` | | 1.31% | `python` | `long_to_decimal_string_internal` | | 1.22% | `python` | `PyUnicode_Format` | ## pycparser | percentage | object | symbol | | ---: | :--- | :--- | | 33.28% | `python` | `_PyEval_EvalFrameDefault` | | 12.20% | `python` | `sre_ucs1_match` | | 4.12% | `python` | `gc_collect_main` | | 2.40% | `libc-2.31.so` | `pthread_attr_setschedparam` | | 2.26% | `python` | `_PyObject_Malloc` | | 2.18% | `python` | `_Py_dict_lookup` | | 1.90% | `python` | `_PyObject_Free` | | 1.75% | `python` | `unicodekeys_lookup_unicode` | | 1.17% | `python` | `visit_decref` | | 1.15% | `python` | `PySlice_AdjustIndices` | | 1.11% | `python` | `subtype_traverse` | ## pyflate | percentage | object | symbol | | ---: | :--- | :--- | | 45.53% | `python` | `_PyEval_EvalFrameDefault` | | 4.36% | `python` | `list_dealloc` | | 4.13% | `python` | `list_ass_slice` | | 2.86% | `python` | `_PyObject_Free` | | 2.82% | `libc-2.31.so` | `pthread_attr_setschedparam` | | 2.66% | `python` | `list_slice.isra.0` | | 2.03% | `python` | `_PyObject_Malloc` | | 1.99% | `python` | `list_concat` | | 1.62% | `python` | `_PyLong_Subtract` | | 1.54% | `python` | `_PyLong_Add` | | 1.44% | `libc-2.31.so` | `__nss_database_lookup` | ## python_startup | percentage | object | symbol | | ---: | :--- | :--- | | 8.77% | `python` | `_PyEval_EvalFrameDefault` | | 6.77% | `python` | `unicodekeys_lookup_unicode` | | 6.27% | `python` | `gc_collect_main` | | 3.96% | `python` | `visit_decref` | | 2.77% | `python` | `visit_reachable` | | 2.65% | `libc-2.31.so` | `__nss_database_lookup` | | 2.49% | `python` | `_Py_dict_lookup` | | 2.33% | `python` | `_PyObject_Malloc` | | 1.47% | `python` | `update_one_slot` | | 1.45% | `python` | `_PyObject_Free` | | 1.45% | `python` | `_PyStaticCode_Fini` | ## python_startup_no_site | percentage | object | symbol | | ---: | :--- | :--- | | 7.45% | `python` | `_PyEval_EvalFrameDefault` | | 6.93% | `python` | `gc_collect_main` | | 5.95% | `python` | `unicodekeys_lookup_unicode` | | 3.51% | `python` | `visit_decref` | | 3.42% | `python` | `visit_reachable` | | 3.12% | `python` | `_PyStaticCode_Fini` | | 2.44% | `libc-2.31.so` | `__nss_database_lookup` | | 2.03% | `python` | `_Py_dict_lookup` | | 1.83% | `python` | `_PyObject_Malloc` | | 1.73% | `python` | `_PyObject_Free` | | 1.41% | `python` | `update_one_slot` | ## raytrace | percentage | object | symbol | | ---: | :--- | :--- | | 49.07% | `python` | `_PyEval_EvalFrameDefault` | | 3.28% | `python` | `_PyFrame_ClearExceptCode` | | 2.18% | `python` | `_PyObject_Free` | | 1.73% | `python` | `PyFloat_FromDouble` | | 1.60% | `python` | `tupledealloc` | | 1.59% | `python` | `initialize_locals` | | 1.52% | `python` | `subtype_dealloc` | | 1.39% | `python` | `float_dealloc` | | 1.36% | `python` | `_PyObject_Malloc` | | 1.21% | `python` | `_PyEvalFramePushAndInit` | | 1.19% | `python` | `PyType_GenericAlloc` | ## regex_compile | percentage | object | symbol | | ---: | :--- | :--- | | 41.94% | `python` | `_PyEval_EvalFrameDefault` | | 3.24% | `python` | `sre_ucs1_match` | | 2.69% | `python` | `_PyObject_Malloc` | | 2.57% | `python` | `_PyObject_Free` | | 1.94% | `python` | `_PyFrame_ClearExceptCode` | | 1.28% | `python` | `unicodekeys_lookup_unicode` | | 1.14% | `python` | `tupledealloc` | | 1.14% | `python` | `_PyType_Lookup` | | 1.08% | `python` | `advance` | | 1.07% | `libc-2.31.so` | `__nss_database_lookup` | ## regex_dna | percentage | object | symbol | | ---: | :--- | :--- | | 33.77% | `python` | `sre_ucs1_match` | | 30.78% | `python` | `sre_ucs2_charset.isra.0` | | 6.96% | `python` | `sre_search` | | 6.17% | `python` | `_PyEval_EvalFrameDefault` | | 2.75% | `libm-2.31.so` | `__fmod_finite` | | 1.19% | `libc-2.31.so` | `__nss_database_lookup` | | 1.04% | `_bisect.cpython-312-x86_64-linux-gnu.so` | `_bisect_bisect_right` | ## regex_effbot | percentage | object | symbol | | ---: | :--- | :--- | | 40.91% | `python` | `sre_ucs1_match` | | 16.04% | `python` | `sre_ucs2_charset.isra.0` | | 6.86% | `python` | `sre_search` | | 6.37% | `python` | `_PyObject_Free` | | 4.52% | `python` | `_PyEval_EvalFrameDefault` | | 3.12% | `python` | `_PyObject_Malloc` | | 1.86% | `python` | `sre_ucs1_count` | | 1.13% | `python` | `unicodekeys_lookup_unicode` | | 1.09% | `python` | `gc_collect_main` | ## regex_v8 | percentage | object | symbol | | ---: | :--- | :--- | | 44.44% | `python` | `sre_ucs1_match` | | 7.62% | `python` | `_PyEval_EvalFrameDefault` | | 5.58% | `python` | `sre_search` | | 5.57% | `python` | `sre_ucs1_count` | | 4.31% | `libc-2.31.so` | `pthread_attr_setschedparam` | | 2.15% | `python` | `pattern_subx` | | 1.86% | `python` | `_PyObject_Free` | | 1.78% | `python` | `_PyObject_Malloc` | | 1.63% | `python` | `_sre_SRE_Pattern_search` | | 1.36% | `libc-2.31.so` | `__nss_database_lookup` | | 1.32% | `python` | `pattern_new_match.isra.0.part.0` | ## richards | percentage | object | symbol | | ---: | :--- | :--- | | 51.99% | `python` | `_PyEval_EvalFrameDefault` | | 6.22% | `python` | `unicodekeys_lookup_unicode` | | 3.76% | `python` | `_PyType_Lookup` | | 2.72% | `python` | `PyObject_GenericGetAttr` | | 2.48% | `python` | `_PyObject_GetInstanceAttribute` | | 2.35% | `python` | `_PyFrame_ClearExceptCode` | | 2.05% | `python` | `_PyObject_GetMethod` | | 1.46% | `python` | `PyObject_GetAttr` | | 1.23% | `python` | `gc_collect_main` | | 1.21% | `python` | `_Py_dict_lookup` | ## scimark | percentage | object | symbol | | ---: | :--- | :--- | | 44.25% | `python` | `_PyEval_EvalFrameDefault` | | 3.66% | `array.cpython-312-x86_64-linux-gnu.so` | `array_subscr` | | 3.60% | `python` | `PyFloat_FromDouble` | | 3.51% | `python` | `PyType_GetModuleByDef` | | 2.78% | `python` | `PyNumber_AsSsize_t` | | 2.72% | `python` | `_PyObject_Free` | | 2.60% | `python` | `vgetargs1_impl` | | 2.49% | `python` | `PyObject_GetItem` | | 2.13% | `python` | `_PyLong_Add` | | 1.83% | `python` | `_PyObject_Malloc` | | 1.56% | `python` | `convertitem` | ## spectral_norm | percentage | object | symbol | | ---: | :--- | :--- | | 37.76% | `python` | `_PyEval_EvalFrameDefault` | | 9.53% | `python` | `_PyLong_Add` | | 5.06% | `python` | `_PyObject_Free` | | 3.51% | `python` | `float_div` | | 3.49% | `python` | `_PyObject_Malloc (inlined)` | | 2.56% | `python` | `long_div` | | 1.98% | `python` | `_PyLong_Multiply` | | 1.91% | `python` | `PyType_IsSubtype` | | 1.90% | `python` | `enum_next` | | 1.78% | `python` | `listiter_next` | | 1.75% | `python` | `_PyFrame_ClearExceptCode` | ## sqlalchemy_declarative | percentage | object | symbol | | ---: | :--- | :--- | | 23.87% | `python` | `_PyEval_EvalFrameDefault` | | 4.81% | `python` | `unicodekeys_lookup_unicode` | | 3.18% | `python` | `gc_collect_main` | | 2.76% | `python` | `_Py_dict_lookup` | | 2.35% | `python` | `_PyObject_Malloc` | | 2.07% | `python` | `_PyType_Lookup` | | 2.02% | `libc-2.31.so` | `__nss_database_lookup` | | 1.86% | `python` | `visit_decref` | | 1.84% | `python` | `_PyObject_Free` | | 1.57% | `python` | `_PyFrame_ClearExceptCode` | | 1.50% | `python` | `visit_reachable` | ## sqlalchemy_imperative | percentage | object | symbol | | ---: | :--- | :--- | | 28.24% | `python` | `_PyEval_EvalFrameDefault` | | 4.85% | `python` | `unicodekeys_lookup_unicode` | | 2.56% | `python` | `gc_collect_main` | | 2.33% | `python` | `_Py_dict_lookup` | | 2.31% | `python` | `_PyObject_Malloc` | | 2.26% | `python` | `_PyType_Lookup` | | 2.15% | `python` | `PyObject_GenericGetAttr` | | 1.72% | `python` | `_PyObject_Free` | | 1.68% | `libc-2.31.so` | `__nss_database_lookup` | | 1.34% | `python` | `tupledealloc` | | 1.25% | `python` | `PyObject_GetAttr` | ## sqlglot | percentage | object | symbol | | ---: | :--- | :--- | | 36.89% | `python` | `_PyEval_EvalFrameDefault` | | 2.93% | `python` | `_PyObject_Free` | | 2.78% | `python` | `unicodekeys_lookup_unicode` | | 2.36% | `python` | `_PyType_Lookup` | | 2.36% | `python` | `_PyObject_Malloc` | | 2.01% | `python` | `_PyFrame_ClearExceptCode` | | 1.63% | `python` | `PyObject_GenericGetAttr` | | 1.48% | `python` | `PyType_IsSubtype` | | 1.39% | `python` | `gc_collect_main` | | 1.26% | `libc-2.31.so` | `__nss_database_lookup` | | 1.25% | `python` | `tupledealloc` | ## sqlite_synth | percentage | object | symbol | | ---: | :--- | :--- | | 11.83% | `libpthread-2.31.so` | `pthread_mutex_unlock` | | 11.81% | `libpthread-2.31.so` | `__pthread_mutex_lock` | | 8.98% | `python` | `_PyEval_EvalFrameDefault` | | 4.36% | `libsqlite3.so.0.8.6` | `sqlite3_reset` | | 2.83% | `python` | `take_gil` | | 2.29% | `python` | `_PyObject_Malloc` | | 2.23% | `python` | `_PyObject_Free` | | 2.07% | `libm-2.31.so` | `f64xsubf128` | | 1.29% | `libsqlite3.so.0.8.6` | `sqlite3_randomness` | | 1.14% | `python` | `unicodekeys_lookup_unicode` | | 1.10% | `libpthread-2.31.so` | `pthread_cond_signal@@GLIBC_2.3.2` | ## sympy | percentage | object | symbol | | ---: | :--- | :--- | | 25.90% | `python` | `_PyEval_EvalFrameDefault` | | 3.83% | `python` | `unicodekeys_lookup_unicode` | | 2.80% | `python` | `_PyObject_Malloc` | | 2.38% | `python` | `_PyObject_Free` | | 2.37% | `python` | `_PyType_Lookup` | | 1.80% | `python` | `tupledealloc` | | 1.78% | `libc-2.31.so` | `__nss_database_lookup` | | 1.46% | `python` | `_PyFrame_ClearExceptCode` | | 1.38% | `python` | `gc_collect_main` | | 1.36% | `python` | `initialize_locals` | | 1.26% | `python` | `_Py_dict_lookup` | ## telco | percentage | object | symbol | | ---: | :--- | :--- | | 17.31% | `python` | `_PyEval_EvalFrameDefault` | | 5.05% | `python` | `_PyObject_Malloc` | | 4.26% | `python` | `_PyObject_Free` | | 2.20% | `libc-2.31.so` | `__nss_database_lookup` | | 2.00% | `_decimal.cpython-312-x86_64-linux-gnu.so` | `_mpd_qaddsub` | | 1.93% | `_decimal.cpython-312-x86_64-linux-gnu.so` | `_mpd_check_exp` | | 1.67% | `python` | `PyContextVar_Get` | | 1.63% | `_decimal.cpython-312-x86_64-linux-gnu.so` | `_mpd_qmul` | | 1.62% | `_decimal.cpython-312-x86_64-linux-gnu.so` | `mpd_setdigits` | | 1.55% | `python` | `unicodekeys_lookup_unicode` | | 1.44% | `_decimal.cpython-312-x86_64-linux-gnu.so` | `nm_mpd_qadd` | ## thrift | percentage | object | symbol | | ---: | :--- | :--- | | 21.65% | `python` | `_PyEval_EvalFrameDefault` | | 3.61% | `python` | `unicodekeys_lookup_unicode` | | 3.32% | `python` | `_PyObject_Malloc` | | 2.94% | `python` | `initialize_locals` | | 2.77% | `python` | `_PyObject_Free` | | 1.89% | `python` | `PyObject_GenericGetAttr` | | 1.83% | `python` | `_PyType_Lookup` | | 1.71% | `fastbinary.cpython-312-x86_64-linux-gnu.so` | `apache::thrift::py::ProtocolBaseThis graph takes the top 10 functions across all benchmarks and plots their relative contributions.
Graph of time spent in the top 10 functions by benchmark
*Apologies that this isn't color-blind friendly -- I need to work on improving this graph.* EDIT: Made it more obvious that the scales are percentages and the extra space is "other functions". ![perf](https://user-images.githubusercontent.com/38294/230391561-938abd00-ae77-464c-967a-b65708bf14d9.png)All data as CSV: perf.zip