From 47f6b33f9e832921b338a399eea85ef46a3fe7e5 Mon Sep 17 00:00:00 2001 From: brharrington Date: Thu, 11 May 2023 19:50:13 -0500 Subject: [PATCH] minor optimization for AsciiSet (#1061) Adjust containsAll check to an indexOf operation so when doing the replacement the prefix of matching characters do not need to be re-checked. --- .../com/netflix/spectator/impl/AsciiSet.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/spectator-api/src/main/java/com/netflix/spectator/impl/AsciiSet.java b/spectator-api/src/main/java/com/netflix/spectator/impl/AsciiSet.java index 70f616161..d2d518c04 100644 --- a/spectator-api/src/main/java/com/netflix/spectator/impl/AsciiSet.java +++ b/spectator-api/src/main/java/com/netflix/spectator/impl/AsciiSet.java @@ -188,13 +188,17 @@ public boolean contains(char c) { * Returns true if all characters in the string are contained within the set. */ public boolean containsAll(CharSequence str) { + return indexOfNonMember(str) == str.length(); + } + + private int indexOfNonMember(CharSequence str) { final int n = str.length(); for (int i = 0; i < n; ++i) { if (!contains(str.charAt(i))) { - return false; + return i; } } - return true; + return n; } /** @@ -204,7 +208,8 @@ public String replaceNonMembers(String input, char replacement) { if (!contains(replacement)) { throw new IllegalArgumentException(replacement + " is not a member of " + pattern); } - return containsAll(input) ? input : replaceNonMembersImpl(input, replacement); + int i = indexOfNonMember(input); + return i < input.length() ? replaceNonMembersImpl(input, i, replacement) : input; } /** @@ -254,14 +259,14 @@ public AsciiSet invert() { return new AsciiSet(invertMembers); } - private String replaceNonMembersImpl(String input, char replacement) { + private String replaceNonMembersImpl(String input, int start, char replacement) { final int n = input.length(); final char[] buf = input.toCharArray(); - for (int i = 0; i < n; ++i) { - final char c = buf[i]; - if (!contains(c)) { + buf[start] = replacement; + for (int i = start + 1; i < n; ++i) { + final char c = input.charAt(i); + if (!contains(c)) buf[i] = replacement; - } } return newString(buf); }