Skip to content

Commit 641077b

Browse files
committed
Further reduce the code in our benchmarks
1 parent 5a534a4 commit 641077b

File tree

2 files changed

+80
-179
lines changed

2 files changed

+80
-179
lines changed

mx.graalpython/mx_graalpython_benchmark.py

Lines changed: 80 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# OF THE POSSIBILITY OF SUCH DAMAGE.
2424
from __future__ import print_function
2525

26+
import itertools
2627
import functools
2728
import statistics
2829
import sys
@@ -54,14 +55,7 @@
5455
# constants
5556
#
5657
# ----------------------------------------------------------------------------------------------------------------------
57-
ENV_PYPY_HOME = "PYPY_HOME"
58-
ENV_PYTHON3_HOME = "PYTHON3_HOME"
59-
ENV_VIRTUAL_ENV = "VIRTUAL_ENV"
60-
ENV_JYTHON_JAR = "JYTHON_JAR"
6158
VM_NAME_GRAALPYTHON = "graalpython"
62-
VM_NAME_CPYTHON = "cpython"
63-
VM_NAME_PYPY = "pypy"
64-
VM_NAME_JYTHON = "jython"
6559
VM_NAME_GRAALPYTHON_SVM = "graalpython-svm"
6660
GROUP_GRAAL = "Graal"
6761
SUBGROUP_GRAAL_PYTHON = "graalpython"
@@ -129,12 +123,11 @@ def _handle_var(key_value):
129123
#
130124
# ----------------------------------------------------------------------------------------------------------------------
131125
class AbstractPythonVm(OutputCapturingVm, ABC):
132-
def __init__(self, name, config_name, options=None, env=None):
126+
def __init__(self, name, config_name, options=None):
133127
super().__init__()
134128
self._name = name
135129
self._config_name = config_name
136130
self._options = options
137-
self._env = env
138131

139132
@property
140133
def options(self):
@@ -153,21 +146,21 @@ def interpreter(self):
153146
def post_process_command_line_args(self, args):
154147
return args
155148

156-
def run_vm(self, args, out=None, err=None, cwd=None, nonZeroIsFatal=False):
149+
def run_vm(self, args, out=None, err=None, cwd=None, nonZeroIsFatal=False, env=None):
157150
mx.logv(shlex.join([self.interpreter] + args))
158151
return mx.run(
159152
[self.interpreter] + args,
160153
out=out,
161154
err=err,
162155
cwd=cwd,
163156
nonZeroIsFatal=nonZeroIsFatal,
164-
env=self._env
157+
env=env,
165158
)
166159

167160

168161
class AbstractPythonIterationsControlVm(AbstractPythonVm):
169-
def __init__(self, name, config_name, options=None, env=None, iterations=None):
170-
super().__init__(name, config_name, options=options, env=env)
162+
def __init__(self, name, config_name, options=None, iterations=None):
163+
super().__init__(name, config_name, options=options)
171164
try:
172165
self._iterations = int(iterations)
173166
except:
@@ -194,10 +187,8 @@ def run_vm(self, args, *splat, **kwargs):
194187

195188

196189
class CPythonVm(AbstractPythonIterationsControlVm):
197-
PYTHON_INTERPRETER = "python3"
198-
199-
def __init__(self, config_name, options=None, env=None, virtualenv=None, iterations=0):
200-
super().__init__(VM_NAME_CPYTHON, config_name, options=options, env=env, iterations=iterations)
190+
def __init__(self, config_name, options=None, virtualenv=None, iterations=0):
191+
super().__init__("cpython", config_name, options=options, iterations=iterations)
201192
self._virtualenv = virtualenv
202193

203194
def override_iterations(self, requested_iterations):
@@ -206,41 +197,74 @@ def override_iterations(self, requested_iterations):
206197

207198
@property
208199
def interpreter(self):
209-
venv = self._virtualenv if self._virtualenv else mx.get_env(ENV_VIRTUAL_ENV)
210-
if venv:
211-
mx.log(f"CPythonVM virtualenv={venv}")
212-
return os.path.join(venv, 'bin', CPythonVm.PYTHON_INTERPRETER)
213-
home = mx.get_env(ENV_PYTHON3_HOME)
214-
if home:
215-
mx.log(f"CPythonVM python3 home={home}")
216-
return os.path.join(home, CPythonVm.PYTHON_INTERPRETER)
217-
return CPythonVm.PYTHON_INTERPRETER
200+
candidates_pre = [
201+
self._virtualenv,
202+
mx.get_env("VIRTUAL_ENV"),
203+
mx.get_env("PYTHON3_HOME"),
204+
]
205+
candidates_suf = [
206+
join("bin", "python3"),
207+
join("bin", "python"),
208+
"python3",
209+
"python",
210+
sys.executable,
211+
]
212+
for p, s in itertools.product(candidates_pre, candidates_suf):
213+
if os.path.exists(exe := os.path.join(p or "", s)):
214+
mx.log(f"CPython VM {exe=}")
215+
return exe
216+
assert False, "sys.executable should really exist"
217+
218+
def run_vm(self, args, *splat, **kwargs):
219+
for idx, arg in enumerate(args):
220+
if "--vm.Xmx" in arg:
221+
mx.warn(f"Ignoring {arg}, cannot restrict memory on CPython.")
222+
args = args[:idx] + args[idx + 1 :]
223+
break
224+
return super().run_vm(args, *splat, **kwargs)
218225

219226

220227
class PyPyVm(AbstractPythonIterationsControlVm):
221-
PYPY_INTERPRETER = "pypy3"
222-
223-
def __init__(self, config_name, options=None, env=None, virtualenv=None, iterations=0):
224-
super().__init__(VM_NAME_PYPY, config_name, options=options, env=env, iterations=iterations)
228+
def __init__(self, config_name, options=None, virtualenv=None, iterations=0):
229+
super().__init__("pypy", config_name, options=options, iterations=iterations)
225230

226231
def override_iterations(self, requested_iterations):
227232
# PyPy warms up much faster, half should be enough
228233
return int(requested_iterations / 2)
229234

230235
@property
231236
def interpreter(self):
232-
home = mx.get_env(ENV_PYPY_HOME)
233-
if not home:
237+
if home := mx.get_env("PYPY_HOME"):
238+
exe = join(home, "bin", "pypy3")
239+
else:
234240
try:
235-
return subprocess.check_output("which %s" % PyPyVm.PYPY_INTERPRETER, shell=True).decode().strip()
241+
exe = subprocess.check_output("which pypy3", shell=True).decode().strip()
236242
except OSError:
237-
mx.abort("{} is not set!".format(ENV_PYPY_HOME))
238-
return join(home, 'bin', PyPyVm.PYPY_INTERPRETER)
243+
mx.abort("PYPY_HOME is not set!")
244+
mx.log(f"PyPy {exe=}")
245+
return exe
246+
247+
def run_vm(self, args, *splat, env=None, **kwargs):
248+
env = env or os.environ.copy()
249+
xmxArg = re.compile("--vm.Xmx([0-9]+)([kKgGmM])")
250+
pypyGcMax = "8GB"
251+
for idx, arg in enumerate(args):
252+
if m := xmxArg.search(arg):
253+
args = args[:idx] + args[idx + 1 :]
254+
pypyGcMax = f"{m.group(1)}{m.group(2).upper()}B"
255+
mx.log(f"Setting PYPY_GC_MAX={pypyGcMax} via {arg}")
256+
break
257+
else:
258+
mx.log(
259+
f"Setting PYPY_GC_MAX={pypyGcMax}, use --vm.Xmx argument to override it"
260+
)
261+
env["PYPY_GC_MAX"] = pypyGcMax
262+
return super().run_vm(args, *splat, env=env, **kwargs)
239263

240264

241265
class GraalPythonVm(AbstractPythonIterationsControlVm):
242-
def __init__(self, config_name, options=None, env=None, virtualenv=None, iterations=None, extra_polyglot_args=None):
243-
super().__init__(VM_NAME_GRAALPYTHON, config_name, options=options, env=env, iterations=iterations)
266+
def __init__(self, config_name, options=None, virtualenv=None, iterations=None, extra_polyglot_args=None):
267+
super().__init__(VM_NAME_GRAALPYTHON, config_name, options=options, iterations=iterations)
244268
self._extra_polyglot_args = extra_polyglot_args or []
245269

246270
@property
@@ -311,15 +335,14 @@ def get_extra_polyglot_args(self):
311335

312336
class GraalPythonJavaDriverVm(GuestVm):
313337
def __init__(self, config_name=CONFIGURATION_DEFAULT, cp_suffix=None, distributions=None, cp_prefix=None,
314-
host_vm=None, extra_vm_args=None, extra_polyglot_args=None, env=None):
338+
host_vm=None, extra_vm_args=None, extra_polyglot_args=None):
315339
super().__init__(host_vm=host_vm)
316340
self._config_name = config_name
317341
self._distributions = distributions or ['GRAALPYTHON_BENCH']
318342
self._cp_suffix = cp_suffix
319343
self._cp_prefix = cp_prefix
320344
self._extra_vm_args = extra_vm_args
321345
self._extra_polyglot_args = extra_polyglot_args if isinstance(extra_polyglot_args, list) else []
322-
self._env = env
323346

324347
def name(self):
325348
return VM_NAME_GRAALPYTHON
@@ -341,30 +364,28 @@ def get_classpath(self):
341364
def with_host_vm(self, host_vm):
342365
return self.__class__(config_name=self._config_name, distributions=self._distributions,
343366
cp_suffix=self._cp_suffix, cp_prefix=self._cp_prefix, host_vm=host_vm,
344-
extra_vm_args=self._extra_vm_args, extra_polyglot_args=self._extra_polyglot_args,
345-
env=self._env)
367+
extra_vm_args=self._extra_vm_args, extra_polyglot_args=self._extra_polyglot_args)
346368

347369
def launcher_class(self):
348370
return 'com.oracle.graal.python.benchmarks.JavaBenchmarkDriver'
349371

350372
def run(self, cwd, args):
351373
extra_polyglot_args = self.get_extra_polyglot_args()
352374
host_vm = self.host_vm()
353-
with environ(self._env or {}):
354-
cp = self.get_classpath()
355-
jhm = mx.dependency("mx:JMH_1_21")
356-
cp_deps = [
357-
mx.distribution('GRAALPYTHON_BENCH', fatalIfMissing=True),
358-
jhm,
359-
mx.dependency("sdk:LAUNCHER_COMMON")
360-
] + jhm.deps
361-
cp += [x.classpath_repr() for x in cp_deps]
362-
java_args = ['-cp', ':'.join(cp)] + [self.launcher_class()]
363-
out = mx.TeeOutputCapture(mx.OutputCapture())
364-
code = host_vm.run_java(java_args + extra_polyglot_args + args, cwd=cwd, out=out, err=out)
365-
out = out.underlying.data
366-
dims = host_vm.dimensions(cwd, args, code, out)
367-
return code, out, dims
375+
cp = self.get_classpath()
376+
jhm = mx.dependency("mx:JMH_1_21")
377+
cp_deps = [
378+
mx.distribution('GRAALPYTHON_BENCH', fatalIfMissing=True),
379+
jhm,
380+
mx.dependency("sdk:LAUNCHER_COMMON")
381+
] + jhm.deps
382+
cp += [x.classpath_repr() for x in cp_deps]
383+
java_args = ['-cp', ':'.join(cp)] + [self.launcher_class()]
384+
out = mx.TeeOutputCapture(mx.OutputCapture())
385+
code = host_vm.run_java(java_args + extra_polyglot_args + args, cwd=cwd, out=out, err=out)
386+
out = out.underlying.data
387+
dims = host_vm.dimensions(cwd, args, code, out)
388+
return code, out, dims
368389

369390
def get_extra_polyglot_args(self):
370391
return ["--experimental-options", "--python.MaxNativeMemory=%s" % (2**34), *self._extra_polyglot_args]
@@ -1001,6 +1022,9 @@ def register_vms(suite, sandboxed_options):
10011022
# Other Python VMs:
10021023
python_vm_registry.add_vm(CPythonVm(config_name=CONFIGURATION_DEFAULT), suite)
10031024
python_vm_registry.add_vm(PyPyVm(config_name=CONFIGURATION_DEFAULT), suite)
1025+
# For continuity with old datapoints, provide CPython and PyPy with launcher config_name
1026+
python_vm_registry.add_vm(CPythonVm(config_name="launcher"), suite)
1027+
python_vm_registry.add_vm(PyPyVm(config_name="launcher"), suite)
10041028

10051029
graalpy_vms = []
10061030

mx.graalpython/mx_graalpython_python_benchmarks.py

Lines changed: 0 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -372,121 +372,6 @@ def parse(self, text: str) -> list:
372372
return r
373373

374374

375-
class GraalPyVm(mx_benchmark.GuestVm):
376-
def __init__(self, config_name, options, host_vm=None):
377-
super(GraalPyVm, self).__init__(host_vm=host_vm)
378-
self._config_name = config_name
379-
self._options = options
380-
381-
def name(self):
382-
return "graalpython"
383-
384-
def config_name(self):
385-
return self._config_name
386-
387-
def hosting_registry(self):
388-
return mx_benchmark.java_vm_registry
389-
390-
def with_host_vm(self, host_vm):
391-
return self.__class__(self.config_name(), self._options, host_vm)
392-
393-
def run(self, cwd, args):
394-
for arg in args:
395-
if "--vm.Xmx" in arg:
396-
mx.log(f"Setting Xmx from {arg}")
397-
break
398-
else:
399-
xmxArg = "--vm.Xmx8G"
400-
mx.log(f"Setting Xmx as {xmxArg}")
401-
args.insert(0, xmxArg)
402-
try:
403-
old_gp_arg = os.environ.get("GRAAL_PYTHON_ARGS")
404-
if old_gp_arg:
405-
os.environ["GRAAL_PYTHON_ARGS"] = old_gp_arg + " " + xmxArg
406-
else:
407-
os.environ["GRAAL_PYTHON_ARGS"] = xmxArg
408-
old_java_opts = os.environ.get("JAVA_OPTS")
409-
if old_java_opts:
410-
os.environ["JAVA_OPTS"] = old_java_opts + " " + xmxArg.replace("--vm", "-")
411-
else:
412-
os.environ["JAVA_OPTS"] = xmxArg.replace("--vm.", "-")
413-
mx.log("Running with `JAVA_OPTS={JAVA_OPTS}` and `GRAAL_PYTHON_ARGS={GRAAL_PYTHON_ARGS}`".format(**os.environ))
414-
return self.host_vm().run_launcher("graalpy", self._options + args, cwd)
415-
finally:
416-
if old_java_opts:
417-
os.environ["JAVA_OPTS"] = old_java_opts
418-
else:
419-
del os.environ["JAVA_OPTS"]
420-
if old_gp_arg:
421-
os.environ["GRAAL_PYTHON_ARGS"] = old_gp_arg
422-
else:
423-
del os.environ["GRAAL_PYTHON_ARGS"]
424-
425-
426-
class PyPyVm(mx_benchmark.Vm):
427-
def config_name(self):
428-
return "launcher"
429-
430-
def name(self):
431-
return "pypy"
432-
433-
def interpreter(self):
434-
home = mx.get_env("PYPY_HOME")
435-
if not home:
436-
try:
437-
return (
438-
subprocess.check_output("which pypy3", shell=True).decode().strip()
439-
)
440-
except OSError:
441-
mx.abort("{} is not set!".format("PYPY_HOME"))
442-
return join(home, "bin", "pypy3")
443-
444-
def run(self, cwd, args):
445-
env = os.environ.copy()
446-
xmxArg = re.compile("--vm.Xmx([0-9]+)([kKgGmM])")
447-
pypyGcMax = "8GB"
448-
for idx, arg in enumerate(args):
449-
if m := xmxArg.search(arg):
450-
args = args[:idx] + args[idx + 1 :]
451-
pypyGcMax = f"{m.group(1)}{m.group(2).upper()}B"
452-
mx.log(f"Setting PYPY_GC_MAX={pypyGcMax} via {arg}")
453-
break
454-
else:
455-
mx.log(
456-
f"Setting PYPY_GC_MAX={pypyGcMax}, use --vm.Xmx argument to override it"
457-
)
458-
env["PYPY_GC_MAX"] = pypyGcMax
459-
return mx.run([self.interpreter()] + args, cwd=cwd, env=env)
460-
461-
462-
class Python3Vm(mx_benchmark.Vm):
463-
def config_name(self):
464-
return "launcher"
465-
466-
def name(self):
467-
return "cpython"
468-
469-
def interpreter(self):
470-
home = mx.get_env("PYTHON3_HOME")
471-
if not home:
472-
return sys.executable
473-
if exists(exe := join(home, "bin", "python3")):
474-
return exe
475-
elif exists(exe := join(home, "python3")):
476-
return exe
477-
elif exists(exe := join(home, "python")):
478-
return exe
479-
return join(home, "bin", "python")
480-
481-
def run(self, cwd, args):
482-
for idx, arg in enumerate(args):
483-
if "--vm.Xmx" in arg:
484-
mx.warn(f"Ignoring {arg}, cannot restrict memory on CPython.")
485-
args = args[:idx] + args[idx + 1 :]
486-
break
487-
return mx.run([self.interpreter()] + args, cwd=cwd)
488-
489-
490375
class WildcardList:
491376
"""It is not easy to track for external suites which benchmarks are
492377
available, so we just return a wildcard list and assume the caller knows
@@ -924,16 +809,8 @@ def register_python_benchmarks():
924809
from mx_graalpython_benchmark import python_vm_registry as vm_registry
925810

926811
python_vm_registry = vm_registry
927-
928812
SUITE = mx.suite("graalpython")
929813

930-
python_vm_registry.add_vm(PyPyVm())
931-
python_vm_registry.add_vm(Python3Vm())
932-
for config_name, options, priority in [
933-
("launcher", [], 5),
934-
]:
935-
python_vm_registry.add_vm(GraalPyVm(config_name, options), SUITE, priority)
936-
937814
mx_benchmark.add_bm_suite(PyPerformanceSuite())
938815
mx_benchmark.add_bm_suite(PyPySuite())
939816
mx_benchmark.add_bm_suite(NumPySuite())

0 commit comments

Comments
 (0)