Parcourir la source

AK: Improve performance of StringUtils::find_last

The current algorithm is currently O(N^2) because we forward-search an
ever-increasing substring of the haystack. This implementation reduces
the search time of a 500,000-length string (where the desired needle is
at index 0) from 72 seconds to 2-3 milliseconds.
Timothy Flynn il y a 1 an
Parent
commit
cae184d7cf
1 fichiers modifiés avec 9 ajouts et 4 suppressions
  1. 9 4
      AK/StringUtils.cpp

+ 9 - 4
AK/StringUtils.cpp

@@ -412,10 +412,15 @@ Optional<size_t> find_last(StringView haystack, char needle)
 
 Optional<size_t> find_last(StringView haystack, StringView needle)
 {
-    for (size_t i = haystack.length(); i > 0; --i) {
-        auto value = StringUtils::find(haystack, needle, i - 1);
-        if (value.has_value())
-            return value;
+    if (needle.length() > haystack.length())
+        return {};
+
+    for (size_t i = haystack.length() - needle.length();; --i) {
+        if (haystack.substring_view(i, needle.length()) == needle)
+            return i;
+
+        if (i == 0)
+            break;
     }
 
     return {};