From 3b36cb2c2c5e2978cc38283e4aa5d71ab5da4335 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Thu, 7 Nov 2024 12:15:09 +0100 Subject: ninjabackend: prefer "in" to regex search Regexes can be surprisingly slow. This small change brings ninja_quote() from 12 to 3 seconds when building QEMU. Before: ncalls tottime percall cumtime percall 3734443 4.872 0.000 11.944 0.000 After: ncalls tottime percall cumtime percall 3595590 3.193 0.000 3.196 0.000 Signed-off-by: Paolo Bonzini Signed-off-by: Eli Schwartz --- mesonbuild/backend/ninjabackend.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 0c34e08de..7244ea90b 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -123,13 +123,6 @@ NINJA_QUOTE_BUILD_PAT = re.compile(r"[$ :\n]") NINJA_QUOTE_VAR_PAT = re.compile(r"[$ \n]") def ninja_quote(text: str, is_build_line: bool = False) -> str: - if is_build_line: - quote_re = NINJA_QUOTE_BUILD_PAT - else: - quote_re = NINJA_QUOTE_VAR_PAT - # Fast path for when no quoting is necessary - if not quote_re.search(text): - return text if '\n' in text: errmsg = f'''Ninja does not support newlines in rules. The content was: @@ -137,7 +130,12 @@ def ninja_quote(text: str, is_build_line: bool = False) -> str: Please report this error with a test case to the Meson bug tracker.''' raise MesonException(errmsg) - return quote_re.sub(r'$\g<0>', text) + + quote_re = NINJA_QUOTE_BUILD_PAT if is_build_line else NINJA_QUOTE_VAR_PAT + if ' ' in text or '$' in text or (is_build_line and ':' in text): + return quote_re.sub(r'$\g<0>', text) + + return text @dataclass -- cgit v1.2.3