From adb9e24fccac4107f705327cd8fe28739c5f6d12 Mon Sep 17 00:00:00 2001 From: Arnaud Nauwynck Date: Sat, 1 Jun 2019 23:22:38 +0200 Subject: [PATCH] enhance memory usage using buffer, or avoiding alloc --- jansi/src/main/java/org/fusesource/jansi/Ansi.java | 2 +- .../org/fusesource/jansi/AnsiOutputStream.java | 4 ++-- .../java/org/fusesource/jansi/AnsiPrintStream.java | 4 ++-- .../java/org/fusesource/jansi/AnsiRenderer.java | 2 +- .../main/java/org/fusesource/jansi/AnsiString.java | 2 +- .../org/fusesource/jansi/FilterPrintStream.java | 14 ++++++++++++-- 6 files changed, 19 insertions(+), 9 deletions(-) diff --git a/jansi/src/main/java/org/fusesource/jansi/Ansi.java b/jansi/src/main/java/org/fusesource/jansi/Ansi.java index 01f0ef46..042ca2a6 100644 --- a/jansi/src/main/java/org/fusesource/jansi/Ansi.java +++ b/jansi/src/main/java/org/fusesource/jansi/Ansi.java @@ -356,7 +356,7 @@ public Ansi reset() { private final ArrayList attributeOptions = new ArrayList(5); public Ansi() { - this(new StringBuilder()); + this(new StringBuilder(80)); } public Ansi(Ansi parent) { diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiOutputStream.java b/jansi/src/main/java/org/fusesource/jansi/AnsiOutputStream.java index bd1507a2..505cf5c0 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiOutputStream.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiOutputStream.java @@ -134,7 +134,7 @@ public synchronized void write(int data) throws IOException { // expected diff w buffer[pos++] = (byte) data; if (!('0' <= data && data <= '9')) { String strValue = new String(buffer, startOfValue, (pos - 1) - startOfValue, Charset.defaultCharset()); - Integer value = new Integer(strValue); + Integer value = Integer.valueOf(strValue); options.add(value); if (data == ';') { state = LOOKING_FOR_NEXT_ARG; @@ -171,7 +171,7 @@ public synchronized void write(int data) throws IOException { // expected diff w buffer[pos++] = (byte) data; if (';' == data) { String strValue = new String(buffer, startOfValue, (pos - 1) - startOfValue, Charset.defaultCharset()); - Integer value = new Integer(strValue); + Integer value = Integer.valueOf(strValue); options.add(value); startOfValue = pos; state = LOOKING_FOR_OSC_PARAM; diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiPrintStream.java b/jansi/src/main/java/org/fusesource/jansi/AnsiPrintStream.java index 1b04b54b..3f73b2da 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiPrintStream.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiPrintStream.java @@ -126,7 +126,7 @@ protected synchronized boolean filter(int data) { // expected diff with AnsiOutp buffer[pos++] = (byte) data; if (!('0' <= data && data <= '9')) { String strValue = new String(buffer, startOfValue, (pos - 1) - startOfValue, Charset.defaultCharset()); - Integer value = new Integer(strValue); + Integer value = Integer.valueOf(strValue); options.add(value); if (data == ';') { state = LOOKING_FOR_NEXT_ARG; @@ -163,7 +163,7 @@ protected synchronized boolean filter(int data) { // expected diff with AnsiOutp buffer[pos++] = (byte) data; if (';' == data) { String strValue = new String(buffer, startOfValue, (pos - 1) - startOfValue, Charset.defaultCharset()); - Integer value = new Integer(strValue); + Integer value = Integer.valueOf(strValue); options.add(value); startOfValue = pos; state = LOOKING_FOR_OSC_PARAM; diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiRenderer.java b/jansi/src/main/java/org/fusesource/jansi/AnsiRenderer.java index 08da2306..ba3f33e5 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiRenderer.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiRenderer.java @@ -60,7 +60,7 @@ public class AnsiRenderer { public static String render(final String input) throws IllegalArgumentException { try { - return render(input, new StringBuilder()).toString(); + return render(input, new StringBuilder(input.length())).toString(); } catch (IOException e) { // Cannot happen because StringBuilder does not throw IOException throw new IllegalArgumentException(e); diff --git a/jansi/src/main/java/org/fusesource/jansi/AnsiString.java b/jansi/src/main/java/org/fusesource/jansi/AnsiString.java index 646f11de..5fb53e45 100644 --- a/jansi/src/main/java/org/fusesource/jansi/AnsiString.java +++ b/jansi/src/main/java/org/fusesource/jansi/AnsiString.java @@ -39,7 +39,7 @@ public AnsiString(final CharSequence str) { private CharSequence chew(final CharSequence str) { assert str != null; - ByteArrayOutputStream buff = new ByteArrayOutputStream(); + ByteArrayOutputStream buff = new ByteArrayOutputStream(str.length()); AnsiOutputStream out = new AnsiOutputStream(buff); try { diff --git a/jansi/src/main/java/org/fusesource/jansi/FilterPrintStream.java b/jansi/src/main/java/org/fusesource/jansi/FilterPrintStream.java index f3971315..f59662f8 100644 --- a/jansi/src/main/java/org/fusesource/jansi/FilterPrintStream.java +++ b/jansi/src/main/java/org/fusesource/jansi/FilterPrintStream.java @@ -29,8 +29,13 @@ public class FilterPrintStream extends PrintStream { private static final String NEWLINE = System.getProperty("line.separator"); + + private static final int TMP_STR_TO_CHAR_BUFFER_LENGTH = 400; + protected final PrintStream ps; + private final char[] strToCharBuffer = new char[TMP_STR_TO_CHAR_BUFFER_LENGTH]; + public FilterPrintStream(PrintStream ps) { super( new OutputStream() { @@ -103,7 +108,7 @@ private void write(char buf[]) { } private void write(String s) { - char[] buf = new char[s.length()]; + char[] buf = (s.length() < strToCharBuffer.length)? strToCharBuffer : new char[s.length()]; s.getChars(0, s.length(), buf, 0); write(buf); } @@ -121,7 +126,12 @@ public void print(boolean b) { @Override public void print(char c) { - write(String.valueOf(c)); + // optim for: write(String.valueOf(c)); + if (filter(c)) + { + ps.print(c); + } + } @Override