我最近开发了自己的文件解析类BufferedParseStream
,并使用它来解码PNG图像。我一直在将它的性能与开源项目PNGJ进行比较,并且已经看到,对于较小的图像尺寸,PNGJ的速度可以达到我自己实现的两倍。我假设这与使用BufferedInputStream
时的实现开销相关联,因为PNGJ会改为使用equivalent。
是否存在指导高性能文件解析的现有设计模式,如int
,float
等原语?
public class BufferedParseStream extends BufferedInputStream {
private final ByteBuffer mByteBuffer;
public BufferedParseStream(final InputStream pInputStream, final int pBufferSize) {
super(pInputStream, pBufferSize);
/* Initialize the ByteBuffer. */
this.mByteBuffer = DataUtils.delegateNative(new byte[8]);
}
private final void buffer(final int pNumBytes) throws IOException {
/* Read the bytes into the ByteStorage. */
this.read(this.getByteBuffer().array(), 0, pNumBytes);
/* Reset the ByteBuffer Location. */
this.getByteBuffer().position(0);
}
public final char parseChar() throws IOException {
/* Read a single byte. */
this.buffer(DataUtils.BYTES_PER_CHAR);
/* Return the corresponding character. */
return this.getByteBuffer().getChar();
}
public final int parseInt() throws IOException {
/* Read four bytes. */
this.buffer(DataUtils.BYTES_PER_INT);
/* Return the corresponding integer. */
return this.getByteBuffer().getInt();
}
public final long parseLong() throws IOException {
/* Read eight bytes. */
this.buffer(DataUtils.BYTES_PER_LONG);
/* Return the corresponding long. */
return this.getByteBuffer().getLong();
}
public final void setParseOrder(final ByteOrder pByteOrder) {
this.getByteBuffer().order(pByteOrder);
}
private final ByteBuffer getByteBuffer() {
return this.mByteBuffer;
}
}
答案 0 :(得分:1)
Java nio应该比使用输入流更快,你提出的类对我来说似乎很奇怪(可能只是我:) :)因为它在ByteBuffer之上有一个额外的层,我认为不需要。
您应该直接使用字节缓冲区,它有一个getInt,getFloat方法,您可以直接将其提供给所需的变量。
我认为虽然你的性能问题可能出现在PNG解码器代码中,正如其他人已经提到的那样。你应该发布它以供进一步分析