我有以下类FilterInputStream的子类,只有一个方法被覆盖。然而,这门课的表现太差了。它的执行速度是其超类的1/10。我甚至从javasrc的InputStream中获取了相同的源代码,并在我的子类中使用它。性能相同。覆盖类有什么问题吗?
public class NewLineStream extends FilterInputStream {
public NewLineStream(InputStream in) {
super(in);
}
public int read(byte[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException ();
} else if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException ();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
if (b != null) {
b[off + i] = (byte)c;
}
}
} catch (IOException ee) {
}
return i;
}
}
答案 0 :(得分:2)
这个方法是逐字节读取的,我猜这就是为什么它表现得这么糟糕。 FilterInputStreams通常只是包装其他输入流,所以如果你不打算进行任何过滤,只需在包装流上调用read(byte [],int,int)。
答案 1 :(得分:0)
是的,你逐个阅读(),如果没有潜在的缓冲,它会非常慢。传入BufferedInputStream,它应该加速。
答案 2 :(得分:0)
对于几乎所有目的,覆盖类的性能命中应该可以忽略不计。
也许问题出在InputStream
你正在装修。
答案 3 :(得分:0)
不,它没有。重写课程有什么问题吗?
但是FilterInputStream只是使用构造函数传递的InputStream周围的装饰器。我会将输入流包装在缓冲的一个周围,如BufferedInputStream:
NewLineStream nws = new NewLineStream(new BufferedInputStream(in));
答案 4 :(得分:0)
大多数时候,当开发人员认为他们发现了JDK中的错误或Java的工作方式时,通常只是开发人员的误解。 Java已经十多年了,最常见的bug已经解决了。
现在可能很难解决很多糟糕的设计决策,但我想不出任何影响性能的因素或者没有已知的工作。