RFR: 8314569: (fs) Improve normalization of UnixPath for directories

Sergey Tsypanov stsypanov at openjdk.org
Fri Aug 18 09:31:38 UTC 2023


Avoiding `String.substring()` call in `UnixPath.normalize()` can significantly reduce normalization costs for directories on Linux:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(time = 2, iterations = 5)
@Measurement(time = 2, iterations = 5)
@Fork(value = 4, jvmArgs = "-Xmx1g")
public class FileToPathBenchmark {

    @Benchmark
    public Path toDirectoryPath(Data data) {
        return FileSystems.getDefault().getPath(data.directoryPath);
    }

    @State(Scope.Thread)
    public static class Data {
        private String directoryPath = "/tmp/tmp/tmp/";
    }
}

Results:

baseline

Benchmark                                                             Mode  Cnt     Score     Error   Units
FileToPathBenchmark.toDirectoryPath                                   avgt   50    40.524 ±   0.940   ns/op
FileToPathBenchmark.toDirectoryPath:·gc.alloc.rate                    avgt   50  3269.167 ± 101.018  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.alloc.rate.norm               avgt   50   175.213 ±   1.200    B/op
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Eden_Space           avgt   50  3279.401 ± 104.252  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Eden_Space.norm      avgt   50   175.756 ±   1.681    B/op
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Survivor_Space       avgt   50     0.006 ±   0.001  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Survivor_Space.norm  avgt   50    ≈ 10⁻³              B/op
FileToPathBenchmark.toDirectoryPath:·gc.count                         avgt   50  1412.000            counts
FileToPathBenchmark.toDirectoryPath:·gc.time                          avgt   50  4144.000                ms

patched

Benchmark                                                             Mode  Cnt     Score     Error   Units
FileToPathBenchmark.toDirectoryPath                                   avgt   50    33.134 ±   2.313   ns/op
FileToPathBenchmark.toDirectoryPath:·gc.alloc.rate                    avgt   50  2652.997 ± 152.758  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.alloc.rate.norm               avgt   50   115.210 ±   1.960    B/op
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Eden_Space           avgt   50  2654.258 ± 157.862  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Eden_Space.norm      avgt   50   115.200 ±   1.960    B/op
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Survivor_Space       avgt   50     0.007 ±   0.001  MB/sec
FileToPathBenchmark.toDirectoryPath:·gc.churn.G1_Survivor_Space.norm  avgt   50    ≈ 10⁻⁴              B/op
FileToPathBenchmark.toDirectoryPath:·gc.count                         avgt   50  1320.000            counts
FileToPathBenchmark.toDirectoryPath:·gc.time                          avgt   50  3939.000                ms

-------------

Commit messages:
 - Improve UnixPath normalization

Changes: https://git.openjdk.org/jdk/pull/15342/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15342&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8314569
  Stats: 1 line in 1 file changed: 0 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/15342.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/15342/head:pull/15342

PR: https://git.openjdk.org/jdk/pull/15342


More information about the nio-dev mailing list