Remove use of UnsafeByteSequence.
We get most of the way there with BAOS in this use case,
except that we pay for additional locking and a call to
Charsets.forName.
JarFileBenchmark results :
AFTER
0% filename=/system/framework/bouncycastle.jar 989706.59 ns; stddev=28699.19 ns @ 10 trials
33% filename=/system/framework/core.jar 1115640.38 ns; stddev=13687.70 ns @ 10 trials
67% filename=/system/framework/framework.jar 1027097.16 ns; stddev=33908.38 ns @ 10 trials
BEFORE
0% filename=/system/framework/bouncycastle.jar 1016998.68 ns; sttdev=9393.46 ns @ 3 trials
33% filename=/system/framework/core.jar 1163348.29 ns; sttdev=42646.58 ns @ 10 trials
67% filename=/system/framework/framework.jar 1042157.91 ns; sttdev=32679.86 ns @ 10 trials
(Cherry picked from b7d186b5f0d2a6406146ad1f366642d86f5e6933)
Bug: b/11411129
Change-Id: Ib94789fb8396b4f2aad31cc8232b6f0bb0672238
diff --git a/luni/src/main/java/java/util/jar/ManifestReader.java b/luni/src/main/java/java/util/jar/ManifestReader.java
index 2faaa90..8760884 100644
--- a/luni/src/main/java/java/util/jar/ManifestReader.java
+++ b/luni/src/main/java/java/util/jar/ManifestReader.java
@@ -17,6 +17,7 @@
package java.util.jar;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@@ -31,7 +32,7 @@
// but a manifest might have thousands of entries.
private final HashMap<String, Attributes.Name> attributeNameCache = new HashMap<String, Attributes.Name>();
- private final UnsafeByteSequence valueBuffer = new UnsafeByteSequence(80);
+ private final ByteArrayOutputStream valueBuffer = new ByteArrayOutputStream(80);
private final byte[] buf;
@@ -141,7 +142,7 @@
boolean lastCr = false;
int mark = pos;
int last = pos;
- valueBuffer.rewind();
+ valueBuffer.reset();
while (pos < buf.length) {
byte next = buf[pos++];
switch (next) {
@@ -175,6 +176,8 @@
}
valueBuffer.write(buf, mark, last - mark);
- value = valueBuffer.toString(StandardCharsets.UTF_8);
+ // A bit frustrating that that Charset.forName will be called
+ // again.
+ value = valueBuffer.toString(StandardCharsets.UTF_8.name());
}
}