On Fri, 27 Jun 2025 16:48:40 GMT, Shaojin Wen <s...@openjdk.org> wrote:

> BufferedWriter -> OutputStreamWriter -> StreamEncoder
> 
> In this call chain, BufferedWriter has a char[] buffer, and StreamEncoder has 
> a ByteBuffer. There are two layers of cache here, or the BufferedWriter layer 
> can be removed. And when charset is UTF8, if the content of write(String) is 
> LATIN1, a conversion from LATIN1 to UTF16 and then to LATIN1 will occur here.
> 
> LATIN1 -> UTF16 -> UTF8
> 
> We can improve BufferedWriter. When the parameter Writer instanceof 
> OutputStreamWriter is passed in, remove the cache and call it directly. In 
> addition, improve write(String) in StreamEncoder to avoid unnecessary 
> encoding conversion.

Performance test data shows that this PR can significantly improve the 
performance of BufferedWriter, and can improve the performance by 30%~50% in 
the write(String) scenario.

## Benchmark Script

git remote add wenshao g...@github.com:wenshao/jdk.git
git fetch wenshao

#baseline
git checkout 2758d6ad7767832db004d28f10cc764f33fa438e
make make test TEST="micro:java.io.BufferedWriterBench"

# current
git checkout 13fd490e75ed3ec4be1957e183ab1631c2029c05
make make test TEST="micro:java.io.BufferedWriterBench"


## Benchmark Numbers on MacBook M1 Pro (aarch64)

# baseline
-Benchmark                             (charType)  (charset)  Mode  Cnt   Score 
  Error  Units
-BufferedWriterBench.writeCharArray         ascii       UTF8  avgt   12   2.672 
± 0.097  us/op
-BufferedWriterBench.writeCharArray  utf8_2_bytes       UTF8  avgt   12  22.310 
± 0.150  us/op
-BufferedWriterBench.writeCharArray  utf8_3_bytes       UTF8  avgt   12  21.442 
± 0.097  us/op
-BufferedWriterBench.writeCharArray         emoji       UTF8  avgt   12  34.750 
± 0.245  us/op
-BufferedWriterBench.writeString            ascii       UTF8  avgt   12   2.831 
± 0.078  us/op
-BufferedWriterBench.writeString     utf8_2_bytes       UTF8  avgt   12  22.200 
± 0.102  us/op
-BufferedWriterBench.writeString     utf8_3_bytes       UTF8  avgt   12  21.522 
± 0.132  us/op
-BufferedWriterBench.writeString            emoji       UTF8  avgt   12  34.973 
± 0.331  us/op

# current
+Benchmark                             (charType)  (charset)  Mode  Cnt   Score 
  Error  Units
+BufferedWriterBench.writeCharArray         ascii       UTF8  avgt   12   2.663 
± 0.077  us/op +0.33%
+BufferedWriterBench.writeCharArray  utf8_2_bytes       UTF8  avgt   12  13.807 
± 0.080  us/op +61.58%
+BufferedWriterBench.writeCharArray  utf8_3_bytes       UTF8  avgt   12  16.157 
± 0.230  us/op +32.71%
+BufferedWriterBench.writeCharArray         emoji       UTF8  avgt   12  21.891 
± 0.158  us/op +58.74%
+BufferedWriterBench.writeString            ascii       UTF8  avgt   12   2.125 
± 0.190  us/op +33.22%
+BufferedWriterBench.writeString     utf8_2_bytes       UTF8  avgt   12  14.260 
± 0.716  us/op +55.68%
+BufferedWriterBench.writeString     utf8_3_bytes       UTF8  avgt   12  12.587 
± 0.099  us/op +70.98%
+BufferedWriterBench.writeString            emoji       UTF8  avgt   12  22.810 
± 0.168  us/op +53.32%

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

PR Comment: https://git.openjdk.org/jdk/pull/26022#issuecomment-3015795787

Reply via email to