java:ByteArrayOutputStream.toByteArray()性能

问题描述 投票:0回答:3

我正在写一个poi工作簿到ByteArrayOutputStream,以获取字节并将其发送到肥皂消息中。

得到ByteArrayOutputStream很好,但调用.toByteArray()非常慢,并消耗了大量的CPU。 我试图转换的工作簿非常大。

有没有人对如何加快速度有任何建议?

谢谢你,杰森

java performance excel apache-poi
3个回答
3
投票

在创建ByteArrayOutputStream对象时是否声明了缓冲区大小?如果没有,您将花时间扩展缓冲区并在每次扩展时复制字节。设置构造函数中所需的最终大小,您应该看到大文件的速度提升。

来自Oracle Documentation:构造函数和描述

ByteArrayOutputStream()

创建一个新的字节数组输出流。

ByteArrayOutputStream(int size)

创建一个新的字节数组输出流,其缓冲区容量为指定大小(以字节为单位)。


2
投票

ByteArrayOutputStream#toByteArray()正在做的唯一密集任务是将字节从内部流缓冲区复制到新的字节数组中。

我确信你不需要这样做,因为无论如何你都会将这些字节发送给SOAP。您应该使用ByteArrayOutputStream#writeTo(OutputStream os)方法将字节流中的字节写入SOAP输出流。


0
投票

还要考虑Spring CoreFastByteArrayOutputStream

它不会在增长时复制字节,也可以通过toByteArrayUnsafe()getInputStream()方法使用它们而不需要复制。

请注意,toByteArrayUnsafe()仅在initialBlockSize足以存储整个数据的情况下才会避免复制。

© www.soinside.com 2019 - 2024. All rights reserved.