2009-07-09 42 views
2

私はFilterInputStreamの以下のクラスサブクラスを持っていますが、オーバーライドされたメソッドは1つだけです。しかし、このクラスのパフォーマンスはとても悪いです。スーパークラスの1/10の速度で実行されます。私はjavasrcのInputStreamから同じソースコードを取り出し、私のサブクラスで使っていました。同じパフォーマンスがヒットしました。クラスのオーバーライドに問題がありますか?Javaクラスをオーバーライドするとパフォーマンスが低下しますか?

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; 
} 

}

+1

はい、あなたは1つずつ読む()、あなたは基本的なバッファリングが進行していない場合、それは本当に遅くなります。 – akarnokd

+0

これはjava.io.InputStreamがどのように実装されているのか、それはなぜ高速ですか? – erotsppa

+0

基本クラスであり、すべての実装がそのメソッドをオーバーライドします。デフォルトは単なるプレースホルダです。 – akarnokd

答えて

2

この方法は1バイトずつ読み込んでいますので、パフォーマンスがあまり良くありません。 FilterInputStreamsは通常他の入力ストリームをラッピングするだけなので、フィルタリングを行わない場合は、ラップされたストリームに対してread(byte []、int、int)を呼び出します。

+2

本当に必要な場合を除き、車輪を改造しないでください。おそらくあなたが望むことをするストリームクラスがあります。 – mcandre

+0

私はパフォーマンスをテストしようとしているので、何もしていません。どうやら何もしないとパフォーマンスは1/10に下がります。 – erotsppa

+0

@erotsppa - 悲惨なほど非効率なInputStreamクラスから一般的なコードを使用しました。 – jsight

0

はい、あなたは(読み)が起こって何の根本的なバッファリングがない場合、一つ一つ、それは本当に遅くなります。 BufferedInputStreamを渡すと速度が上がります。

+0

これは意味をなさないので、FilterInputStreamの実装は です。return in.read(b、off、len); InputStreamはどこにあり、InputStreamの読み込み実装はmineと同じです。 (私はソースコードをコピーしました) – erotsppa

+0

InputStreamはいくつかのデフォルトを持つ基本クラスであり、場合によっては非効率的な実装です。これは、 'use superclass/superinterface'イディオムのために使用されます:InputStream in = new BufferedInputStream(new FileInputStream( "a")); – akarnokd

0

クラスオーバーライドのパフォーマンスヒットは、ほぼすべての目的で無視してください。

おそらく問題は、あなたが飾っているInputStreamです。

0

クラスのオーバーライドに問題がありますか?

いいえ、それはありません。

しかし、FilterInputStreamは、コンストラクタを使用して渡すInputStreamのまわりのデコレータです。私は次のように、のバッファリング1のまわりで私の入力ストリームをラップしますBufferedInputStream

NewLineStream nws = new NewLineStream(new BufferedInputStream(in)); 
+0

+1私から。もっと詳しく説明することはできません。 – akarnokd

0

開発者はJDKのバグを見つけたりしていると感じたときの時間のほとんどのJavaは、一部には、その通常は誤解をどのように動作しますか開発者のJavaは10年以上にわたり、最も一般的なバグはすでに解決されています。

悪意のある設計上の意思決定は、現在は修正するのが難しいかもしれませんが、パフォーマンスに影響を及ぼしたり、既知の回避策がないものは考えられません。

関連する問題