0

バイト番号を読んでいた場合、次のようにします。

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    int size = (int) stream.Length;
    BinaryReader br = new BinaryReader(stream);
    byte[] test = new byte[size];
    test = br.ReadBytes(size);
    br.Close();
}

しかし、私は Uint16 を読みたいので、次のように打たれました:

using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    int size = (int) stream.Length;
    BinaryReader br = new BinaryReader(stream);
    float[] test = new byte[size/2];
    for (int i = 0; i < size/2; ++i)
    {
         test[i] = br.ReadUInt16();
    }
    br.Close();
}

ファイル全体を一度に読み取るためのより高速な方法はありますか、それとも速度の違いはごくわずかですか?

4

2 に答える 2

1

ファイルが大きすぎてメモリに収まらない場合は、すべてのバイトを MemoryStream に読み取ってから、そのストリームから Uint16 を読み取る方が高速です。そのようです:

byte[] data;
int size;
using (FileStream stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    size = (int) stream.Length;
    data = new byte[size];
    stream.Read(data, 0, size);
}

uint[] uintData = new uint[size / 2];
using (var memoryStream = new MemoryStream(data))
using (var reader = new BinaryReader(memoryStream))
    for (int i = 0; i < size / 2; i++)
        uintData[i] = reader.ReadUInt16();

// Done.
于 2012-05-03T20:42:38.073 に答える
0

まず、次の行は必要ありません。

byte[] test = new byte[size];

次の行のため

test = br.ReadBytes(size);

別の配列をtest指します。そう、

byte[] test = br.ReadBytes(size);

で十分です。


あなたの質問について:ループで s をBinaryReader.ReadBytes実行するだけなのでStream.Read(ILSpy を使用するか、参照ソース コードを参照してこれを確認できます)、コード例間のパフォーマンスの違いは無視できると思います。確かに、いくつかの測定を行うことをお勧めします。

于 2012-05-03T20:44:43.997 に答える