From aac13242c1e2bb6d1870e1284795bd3ca370984c Mon Sep 17 00:00:00 2001 From: nharmata Date: Mon, 24 Apr 2017 17:41:23 +0200 Subject: Make PathFragment an abstract class. There are now four concrete implementations: RelativeUnixPathFragment, AbsoluteUnixPathFragment, RelativeWindowsPathFragment, AbsoluteWindowsPathFragment. Goals: -Reduce memory usage of PathFragment on non-Windows platforms while maintaining existing semantics. -Make a few simple performance improvements along the way. -Add TODOs for a few more simple performance improvements. -Open the way for reducing code complexity of PathFragment. All of the Windows-specific stuff ought not complicate the code so much. Non goals: -Make the entire codebase as pretty as possible wrt PathFragment & Windows. -Make PathFragment usage more sane in general (e.g. change semantics to ban coexistence of Windows and Unix PathFragments). -Optimize PathFragment as much as possible wrt memory or even in any other dimensions (e.g. gc churn, cpu). To elaborate, the primary motivation is per-instance memory usage of PathFragment on Unix platforms: Before this change ------------------ +UseCompressedOops --> 32 bytes per instance -UseCompressedOops --> 40 bytes per instance After this change ------------------ +UseCompressedOops --> 24 bytes per instance -UseCompressedOops --> 32 bytes per instance Since Bazel can retain lots of PathFragments, the memory savings of this CL are fairly large. RELNOTES: None PiperOrigin-RevId: 154052905 --- .../com/google/devtools/build/lib/vfs/PathFragmentTest.java | 3 ++- .../google/devtools/build/lib/vfs/PathFragmentWindowsTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'src/test/java/com/google/devtools') diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java index 2e455ccae8..4b84903601 100644 --- a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java +++ b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentTest.java @@ -73,7 +73,8 @@ public class PathFragmentTest { .addEqualityGroup( PathFragment.create("../relative/path"), PathFragment.create("..").getRelative("relative").getRelative("path"), - PathFragment.createNoClone('\0', false, new String[] {"..", "relative", "path"}), + PathFragment.createAlreadyInterned( + '\0', false, new String[] {"..", "relative", "path"}), PathFragment.create(new File("../relative/path"))) .addEqualityGroup(PathFragment.create("something/else")) .addEqualityGroup(PathFragment.create("/something/else")) diff --git a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java index 4915a889ff..90cc615836 100644 --- a/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java +++ b/src/test/java/com/google/devtools/build/lib/vfs/PathFragmentWindowsTest.java @@ -131,7 +131,7 @@ public class PathFragmentWindowsTest { private void assertRelativeTo(String path, String relativeTo, String... expectedPathSegments) throws Exception { - PathFragment expected = PathFragment.createNoClone('\0', false, expectedPathSegments); + PathFragment expected = PathFragment.createAlreadyInterned('\0', false, expectedPathSegments); PathFragment actual = PathFragment.create(path).relativeTo(relativeTo); assertThat(actual.getPathString()).isEqualTo(expected.getPathString()); assertThat(actual).isEqualTo(expected); @@ -149,7 +149,7 @@ public class PathFragmentWindowsTest { } private static PathFragment makePath(char drive, boolean absolute, String... segments) { - return PathFragment.createNoClone(drive, absolute, segments); + return PathFragment.createAlreadyInterned(drive, absolute, segments); } @Test @@ -235,9 +235,9 @@ public class PathFragmentWindowsTest { PathFragment.EMPTY_FRAGMENT, PathFragment.create("C:"), PathFragment.create("D:"), - PathFragment.createNoClone('\0', false, new String[0]), - PathFragment.createNoClone('C', false, new String[0]), - PathFragment.createNoClone('D', false, new String[0])); + PathFragment.createAlreadyInterned('\0', false, new String[0]), + PathFragment.createAlreadyInterned('C', false, new String[0]), + PathFragment.createAlreadyInterned('D', false, new String[0])); assertAllEqual(PathFragment.create("/c"), PathFragment.create("/c/")); assertThat(PathFragment.create("C:/")).isNotEqualTo(PathFragment.create("/c")); assertThat(PathFragment.create("C:/foo")).isNotEqualTo(PathFragment.create("/c/foo")); -- cgit v1.2.3