pyodide/benchmark/stack_usage.py

82 lines
2.1 KiB
Python

import pytest
@pytest.fixture(scope="session")
def print_info():
headings = [
"browser",
"py_limit",
"py_usage",
"js_depth",
"py_depth",
"js_depth/py_usage",
"js_depth/py_depth",
]
fmt = "## {{:{:d}s}} {{:{:d}g}} {{:{:d}.2f}} {{:{:d}g}} {{:{:d}g}} {{:{:d}g}} {{:{:d}g}}".format(
*map(len, headings)
)
printed_heading = False
def print_info(*args):
nonlocal printed_heading
if not printed_heading:
printed_heading = True
print("## " + " ".join(headings))
print(fmt.format(*args))
yield print_info
@pytest.mark.skip_refcount_check
@pytest.mark.skip_pyproxy_check
def test_stack_usage(selenium, print_info):
res = selenium.run_js(
"""
self.measure_available_js_stack_depth = () => {
let depth = 0;
function recurse() { depth += 1; recurse(); }
try { recurse(); } catch (err) { }
return depth;
};
let py_limit = pyodide.runPython("import sys; sys.getrecursionlimit()");
let py_usage = pyodide.runPython(`
from js import measure_available_js_stack_depth
def recurse(n):
return measure_available_js_stack_depth() if n==0 else recurse(n-1)
(recurse(0)-recurse(100))/100
`);
let js_depth = measure_available_js_stack_depth();
self.py_depth = [0];
try {
pyodide.runPython(`
import sys
from js import py_depth
sys.setrecursionlimit(2000)
def infiniterecurse():
py_depth[0] += 1
infiniterecurse()
infiniterecurse()
`);
} catch {}
py_depth = py_depth[0];
return [
py_limit,
py_usage,
js_depth,
py_depth,
Math.floor(js_depth/py_usage),
Math.floor(js_depth/py_depth),
]
"""
)
# "py_usage",
# "js_depth",
# "py_depth",
# "js_depth/py_usage",
# "js_depth/py_depth",
print_info(selenium.browser, *res)
selenium.clean_logs()