]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-125985: Fix `cmodule_function()` scaling benchmark (#128460)
authorSam Gross <colesbury@gmail.com>
Fri, 3 Jan 2025 21:48:47 +0000 (16:48 -0500)
committerGitHub <noreply@github.com>
Fri, 3 Jan 2025 21:48:47 +0000 (21:48 +0000)
Add a separate benchmark that measures the effect of
`_PyObject_LookupSpecial()` on scaling.

In the process of cleaning up the scaling benchmarks for inclusion, I
unintentionally changed the "cmodule_function" benchmark to pass an
`int` to `math.floor()` instead of a `float`, which causes it to use the
`_PyObject_LookupSpecial()` code path. `_PyObject_LookupSpecial()` has
its own scaling issues that we want to measure separately from calling a
function on a C module.

Tools/ftscalingbench/ftscalingbench.py

index 767aeae934907043cdd1dc9e2d5f1e4fd195c5a3..364c465bc91b0b642346904397e45f9217524653 100644 (file)
@@ -54,8 +54,16 @@ def object_cfunction():
 
 @register_benchmark
 def cmodule_function():
-    for i in range(1000 * WORK_SCALE):
-        math.floor(i * i)
+    N = 1000 * WORK_SCALE
+    for i in range(N):
+        math.cos(i / N)
+
+@register_benchmark
+def object_lookup_special():
+    # round() uses `_PyObject_LookupSpecial()` internally.
+    N = 1000 * WORK_SCALE
+    for i in range(N):
+        round(i / N)
 
 @register_benchmark
 def mult_constant():
@@ -206,7 +214,7 @@ def benchmark(func):
             color = "\x1b[33m"  # yellow
         reset_color = "\x1b[0m"
 
-    print(f"{color}{func.__name__:<18} {round(factor, 1):>4}x {direction}{reset_color}")
+    print(f"{color}{func.__name__:<25} {round(factor, 1):>4}x {direction}{reset_color}")
 
 def determine_num_threads_and_affinity():
     if sys.platform != "linux":