From bd507a5bd2beb6e5bd09d5d37fccc3d72608554e Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Thu, 20 Jan 2022 11:59:24 +0100 Subject: [PATCH] Speed up event match regex evaluation for big messages `regex.containsMatchIn()` for `.*@room.*` can take significantly longer than checking for `@room` (some real-world events I was getting took around 15 seconds with this, significantly slowing down the sync parsing). Checking `containsMatchIn()` does not lead to different results when having leading and trailing stars however, it will match in the same cases as when these are omitted. For testing purposes, I sent myself some Lorem Ipsum with 5000 words (not containing any @room). Without this change, the regex evaluation takes about 16 seconds. With this change, the regex evaluation now takes significantly less then a second. Change-Id: If3b13304668ad961abb81d5442f37a3a3a1d48b7 --- .../android/sdk/api/pushrules/EventMatchCondition.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt index eec5b0a402..d82365cace 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/EventMatchCondition.kt @@ -56,7 +56,12 @@ class EventMatchCondition( if (wordsOnly) { value.caseInsensitiveFind(pattern) } else { - val modPattern = if (pattern.hasSpecialGlobChar()) pattern.simpleGlobToRegExp() else "*$pattern*".simpleGlobToRegExp() + val modPattern = if (pattern.hasSpecialGlobChar()) + // Regex.containsMatchIn() is way faster without leading and trailing + // stars, that don't make any difference for the evaluation result + pattern.removePrefix("*").removeSuffix("*").simpleGlobToRegExp() + else + pattern.simpleGlobToRegExp() val regex = Regex(modPattern, RegexOption.DOT_MATCHES_ALL) regex.containsMatchIn(value) }