trivial patch to reduce allocations in nio open* methods
Michael Skells
mike.skells1 at gmail.com
Tue Mar 6 08:17:31 UTC 2018
Hi,
below is a trivial patch to reduce allocation on the file open call path,
when no OpenOption is specified( which is a common case in my test code at
least)
There is some duplication of empty set handling, but I could not see a
suitable utility class to provide this and didnt want to create a public
method
Regards
Mike
---
Index:
src/java.base/share/classes/java/nio/channels/AsynchronousFileChannel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
---
src/java.base/share/classes/java/nio/channels/AsynchronousFileChannel.java
(revision
49129:fb9f590b9eeecae202277c0606ed12b4d3f674c3)
+++
src/java.base/share/classes/java/nio/channels/AsynchronousFileChannel.java
(revision
49129+:fb9f590b9eee+)
@@ -301,8 +301,13 @@
public static AsynchronousFileChannel open(Path file, OpenOption...
options)
throws IOException
{
- Set<OpenOption> set = new HashSet<>(options.length);
- Collections.addAll(set, options);
+ Set<OpenOption> set;
+ if (options.length == 0) {
+ set = Collections.emptySet();
+ } else {
+ set = new HashSet<>(options.length);
+ Collections.addAll(set, options);
+ }
return open(file, set, null, NO_ATTRIBUTES);
}
Index: src/java.base/share/classes/java/nio/channels/FileChannel.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/java.base/share/classes/java/nio/channels/FileChannel.java (revision
49129:fb9f590b9eeecae202277c0606ed12b4d3f674c3)
+++ src/java.base/share/classes/java/nio/channels/FileChannel.java (revision
49129+:fb9f590b9eee+)
@@ -335,8 +335,11 @@
public static FileChannel open(Path path, OpenOption... options)
throws IOException
{
- Set<OpenOption> set = new HashSet<>(options.length);
- Collections.addAll(set, options);
+ Set<OpenOption> set;
+ if (options.length > 0) {
+ set = new HashSet<>(options.length);
+ Collections.addAll(set, options);
+ } else set = Collections.emptySet();
return open(path, set, NO_ATTRIBUTES);
}
Index: src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java
(revision
49129:fb9f590b9eeecae202277c0606ed12b4d3f674c3)
+++ src/java.base/share/classes/java/nio/file/spi/FileSystemProvider.java
(revision
49129+:fb9f590b9eee+)
@@ -419,20 +419,22 @@
throws IOException
{
int len = options.length;
- Set<OpenOption> opts = new HashSet<>(len + 3);
+ Set<OpenOption> opts ;
if (len == 0) {
- opts.add(StandardOpenOption.CREATE);
- opts.add(StandardOpenOption.TRUNCATE_EXISTING);
+ opts = DEFAULT_OPEN_OPTIONS;
} else {
+ opts = new HashSet<>(len + 1);
for (OpenOption opt: options) {
if (opt == StandardOpenOption.READ)
throw new IllegalArgumentException("READ not allowed");
opts.add(opt);
}
- }
- opts.add(StandardOpenOption.WRITE);
+ opts.add(StandardOpenOption.WRITE);
+ }
return Channels.newOutputStream(newByteChannel(path, opts));
}
+ private final static Set<OpenOption> DEFAULT_OPEN_OPTIONS =
Collections.unmodifiableSet(
+
EnumSet.of(StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.WRITE));
/**
* Opens or creates a file for reading and/or writing, returning a file
Index: src/java.base/share/classes/java/nio/file/Files.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/java.base/share/classes/java/nio/file/Files.java (revision
49129:fb9f590b9eeecae202277c0606ed12b4d3f674c3)
+++ src/java.base/share/classes/java/nio/file/Files.java (revision
49129+:fb9f590b9eee+)
@@ -410,8 +410,11 @@
public static SeekableByteChannel newByteChannel(Path path,
OpenOption... options)
throws IOException
{
- Set<OpenOption> set = new HashSet<>(options.length);
- Collections.addAll(set, options);
+ Set<OpenOption> set;
+ if (options.length > 0) {
+ set = new HashSet<>(options.length);
+ Collections.addAll(set, options);
+ } else set = Collections.emptySet();
return newByteChannel(path, set);
}
@@ -635,11 +638,12 @@
public static Path createFile(Path path, FileAttribute<?>... attrs)
throws IOException
{
- EnumSet<StandardOpenOption> options =
- EnumSet.<StandardOpenOption>of(StandardOpenOption.CREATE_NEW,
StandardOpenOption.WRITE);
- newByteChannel(path, options, attrs).close();
+ newByteChannel(path, DEFAULT_CREATE_OPTIONS, attrs).close();
return path;
}
+ private final static Set<StandardOpenOption> DEFAULT_CREATE_OPTIONS =
Collections.unmodifiableSet(
+ EnumSet.<StandardOpenOption>of(StandardOpenOption.CREATE_NEW,
StandardOpenOption.WRITE)
+ );
/**
* Creates a new directory. The check for the existence of the file
and the
---
On Tue, 6 Mar 2018 at 01:12 Brian Burkhalter <brian.burkhalter at oracle.com>
wrote:
> Hello,
>
> Redirecting to nio-dev. Please reply omitting core-libs-dev.
>
> If the patch is small you can include it in e-mail to the mailing list as
> attachments are generally scrubbed.
>
> Thanks,
>
> Brian
>
> On Mar 5, 2018, at 4:35 PM, Michael Skells <mike.skells1 at gmail.com> wrote:
>
> I have a trivial patch to reduce allocation of OpenOption sets where no
> args are supplied
>
> Spotted this while working on scala compiler, trying to reduce allocations
>
> I cannot build JDK due to visual studio issues
>
> Can someone progress the patch for me? Dont want to send a patch to this
> mailgroup!
>
> I have previously signed OCA and contributed (although it has been a while)
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/nio-dev/attachments/20180306/dd12ee1a/attachment-0001.html>
More information about the nio-dev
mailing list