120 lines
3.4 KiB
Python
120 lines
3.4 KiB
Python
import sys
|
|
import time
|
|
|
|
from entrypoint2 import entrypoint
|
|
|
|
import pyscreenshot
|
|
from pyscreenshot.plugins.freedesktop_dbus import FreedesktopDBusWrapper
|
|
from pyscreenshot.plugins.gnome_dbus import GnomeDBusWrapper
|
|
from pyscreenshot.plugins.gnome_screenshot import GnomeScreenshotWrapper
|
|
from pyscreenshot.plugins.kwin_dbus import KwinDBusWrapper
|
|
from pyscreenshot.util import run_mod_as_subproc
|
|
|
|
|
|
def run(force_backend, n, childprocess, bbox=None):
|
|
sys.stdout.write("%-20s\t" % force_backend)
|
|
sys.stdout.flush() # before any crash
|
|
# if force_backend == "freedesktop_dbus":
|
|
# return
|
|
if force_backend == "default":
|
|
force_backend = None
|
|
try:
|
|
start = time.time()
|
|
for _ in range(n):
|
|
pyscreenshot.grab(
|
|
backend=force_backend, childprocess=childprocess, bbox=bbox
|
|
)
|
|
end = time.time()
|
|
dt = end - start
|
|
s = "%-4.2g sec\t" % dt
|
|
s += "(%5d ms per call)" % (1000.0 * dt / n)
|
|
sys.stdout.write(s)
|
|
finally:
|
|
print("")
|
|
|
|
|
|
novirt = [
|
|
GnomeDBusWrapper.name,
|
|
KwinDBusWrapper.name,
|
|
GnomeScreenshotWrapper.name,
|
|
FreedesktopDBusWrapper.name,
|
|
]
|
|
|
|
|
|
def run_all(n, childprocess_param, virtual_only=True, bbox=None):
|
|
debug = True
|
|
print("")
|
|
print("n=%s" % n)
|
|
print("------------------------------------------------------")
|
|
|
|
if bbox:
|
|
x1, y1, x2, y2 = map(str, bbox)
|
|
bbox = ":".join(map(str, (x1, y1, x2, y2)))
|
|
bboxpar = ["--bbox", bbox]
|
|
else:
|
|
bboxpar = []
|
|
if debug:
|
|
debugpar = ["--debug"]
|
|
else:
|
|
debugpar = []
|
|
for x in ["default"] + pyscreenshot.backends():
|
|
if x == "freedesktop_dbus":
|
|
continue
|
|
backendpar = ["--backend", x]
|
|
# skip non X backends
|
|
if virtual_only and x in novirt:
|
|
continue
|
|
p = run_mod_as_subproc(
|
|
"pyscreenshot.check.speedtest",
|
|
["--childprocess", childprocess_param, "--number", str(n)]
|
|
+ bboxpar
|
|
+ debugpar
|
|
+ backendpar,
|
|
)
|
|
print(p.stdout)
|
|
|
|
|
|
@entrypoint
|
|
def speedtest(virtual_display=False, backend="", childprocess="", bbox="", number=10):
|
|
"""Performance test of all back-ends.
|
|
|
|
:param virtual_display: run with Xvfb
|
|
:param bbox: bounding box coordinates x1:y1:x2:y2
|
|
:param backend: back-end can be forced if set (example:default, scrot, wx,..),
|
|
otherwise all back-ends are tested
|
|
:param childprocess: pyscreenshot parameter childprocess (0/1)
|
|
:param number: number of screenshots for each backend (default:10)
|
|
"""
|
|
childprocess_param = childprocess
|
|
if childprocess == "":
|
|
childprocess = True # default
|
|
elif childprocess == "0":
|
|
childprocess = False
|
|
elif childprocess == "1":
|
|
childprocess = True
|
|
else:
|
|
raise ValueError("invalid childprocess value")
|
|
|
|
if bbox:
|
|
x1, y1, x2, y2 = map(int, bbox.split(":"))
|
|
bbox = x1, y1, x2, y2
|
|
else:
|
|
bbox = None
|
|
|
|
def f(virtual_only):
|
|
if backend:
|
|
try:
|
|
run(backend, number, childprocess, bbox=bbox)
|
|
except pyscreenshot.FailedBackendError:
|
|
pass
|
|
else:
|
|
run_all(number, childprocess_param, virtual_only=virtual_only, bbox=bbox)
|
|
|
|
if virtual_display:
|
|
from pyvirtualdisplay import Display
|
|
|
|
with Display(visible=0):
|
|
f(virtual_only=True)
|
|
else:
|
|
f(virtual_only=False)
|