From 42deff2c7a2fb749a4e509deea339632f3048770 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 4 Mar 2021 23:49:19 +0100 Subject: [PATCH] a bit of performance: reduce allocation GitOrigin-RevId: e686767e0d5fe6182499491a72e7c241ace23b94 --- .../src/com/intellij/openapi/vfs/VfsUtilCore.java | 15 +++++++-------- .../com/intellij/openapi/vfs/VfsUtilTest.java | 15 +++++++-------- .../src/com/intellij/util/text/CharArrayUtil.java | 12 ++++++++++++ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java b/platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java index 4791e1b16c5f..16911b51bf15 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java @@ -20,6 +20,7 @@ import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.DistinctRootsCollection; import com.intellij.util.io.URLUtil; +import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.*; import java.io.*; @@ -731,19 +732,17 @@ public class VfsUtilCore { path = FileUtil.toCanonicalPath(path); int li = path.length(); while (file != null && li != -1) { - int i = path.lastIndexOf('/', li - 1); + int sepIndex = path.lastIndexOf('/', li - 1); CharSequence fileName = file.getNameSequence(); - if (i == 6 && StringUtil.startsWith(fileName, "//wsl$")) { - i = -1; + int fileNameEnd = fileName.length() + (StringUtil.endsWithChar(fileName, '/') ? -1 : 0); + if (sepIndex == 6 && StringUtil.startsWith(fileName, "//wsl$")) { + sepIndex = -1; } - if (StringUtil.endsWithChar(fileName, '/')) { - fileName = fileName.subSequence(0, fileName.length() - 1); - } - if (!StringUtilRt.equal(fileName, path.substring(i + 1, li), file.isCaseSensitive())) { + if (!CharArrayUtil.regionMatches(fileName, 0, fileNameEnd, path, sepIndex + 1, li, file.isCaseSensitive())) { return false; } file = file.getParent(); - li = i; + li = sepIndex; } return li == -1 && file == null; } diff --git a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilTest.java b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilTest.java index 50d228e2b1cc..4d43533cac57 100644 --- a/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilTest.java +++ b/platform/platform-tests/testSrc/com/intellij/openapi/vfs/VfsUtilTest.java @@ -58,7 +58,6 @@ import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.*; -import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; public class VfsUtilTest extends BareTestFixtureTestCase { @@ -555,12 +554,12 @@ public class VfsUtilTest extends BareTestFixtureTestCase { assumeTrue("No WSL distributions found", !distributions.isEmpty()); String wslName = distributions.get(0); - - VirtualFile file = LocalFileSystem.getInstance().findFileByIoFile(new File("\\\\wsl$\\" + wslName + "\\usr\\bin\\")); - assertTrue(VfsUtilCore.pathEqualsTo(file, "\\\\wsl$\\" + wslName + "\\usr\\bin\\")); - assertTrue(VfsUtilCore.pathEqualsTo(file, "//wsl$/" + wslName + "/usr/bin")); - assertTrue(VfsUtilCore.pathEqualsTo(file, "//wsl$/" + wslName + "/usr/bin/")); - assertFalse(VfsUtilCore.pathEqualsTo(file, "//xxx$/" + wslName + "/usr/bin/")); - assertFalse(VfsUtilCore.pathEqualsTo(file, "//wsl$/xxx/usr/bin/")); + VirtualFile usrBin = LocalFileSystem.getInstance().findFileByIoFile(new File("\\\\wsl$\\" + wslName + "\\usr\\bin\\")); + assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "\\\\wsl$\\" + wslName + "\\usr\\bin\\")); + assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/" + wslName + "/usr/bin")); + assertTrue(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/" + wslName + "/usr/bin/")); + assertFalse(VfsUtilCore.pathEqualsTo(usrBin, "//xxx$/" + wslName + "/usr/bin/")); + assertFalse(VfsUtilCore.pathEqualsTo(usrBin, "//wsl$/xxx/usr/bin/")); + assertFalse(VfsUtilCore.pathEqualsTo(usrBin.getParent(), "//wsl$/xxx/usr")); } } \ No newline at end of file diff --git a/platform/util/strings/src/com/intellij/util/text/CharArrayUtil.java b/platform/util/strings/src/com/intellij/util/text/CharArrayUtil.java index 2cc855d28e27..45ce572bf9cc 100644 --- a/platform/util/strings/src/com/intellij/util/text/CharArrayUtil.java +++ b/platform/util/strings/src/com/intellij/util/text/CharArrayUtil.java @@ -2,6 +2,7 @@ package com.intellij.util.text; import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -296,6 +297,17 @@ public final class CharArrayUtil { } return true; } + public static boolean regionMatches(@NotNull CharSequence s1, int start1, int end1, @NotNull CharSequence s2, int start2, int end2, boolean caseSensitive) { + if (caseSensitive) { + return regionMatches(s1, start1, end1, s2, start2, end2); + } + if (end1-start1 != end2-start2) return false; + + for (int i = start1,j=start2; i < end1; i++,j++) { + if (!StringUtilRt.charsEqualIgnoreCase(s1.charAt(i), s2.charAt(j))) return false; + } + return true; + } public static boolean regionMatches(@NotNull CharSequence buffer, int offset, @NotNull CharSequence s) { if (offset + s.length() > buffer.length()) return false;