23

私はこれを使用しています:

byte[] buffer = new byte[10240];

私が理解しているように、これは0で満たされた10kbのバッファ配列を初期化します。

この配列を毎回ジャンクデータで埋める(または初期化する)最も速い方法は何ですか?

その配列を5000回以上使用し、毎回異なるジャンクデータで埋める必要があるため、高速な方法を探しています。配列サイズも毎回変更する必要があります。

4

5 に答える 5

45

ジャンクデータのプロパティを説明せずに「最速の方法」に答えることは不可能です。すべてのゼロが有効なジャンクデータではないのはなぜですか?

とはいえ、これは配列を無意味な数値で埋める高速な方法です。

Random r = new Random();
r.NextBytes(buffer);

速度が十分でない場合は、独自の線形合同法の実装を検討することもできます。Random実装は簡単で高速ですが、高品質の乱数は得られません。(それらが必要かどうかは私にはわかりません。)

于 2010-06-06T17:49:06.163 に答える
14

データがランダムであることに満足しているが、ランダムシードバッファーから作成されている場合は、次のようにすることができます。

public class RandomBufferGenerator
{
    private readonly Random _random = new Random();
    private readonly byte[] _seedBuffer;

    public RandomBufferGenerator(int maxBufferSize)
    {
        _seedBuffer = new byte[maxBufferSize];

        _random.NextBytes(_seedBuffer);
    }

    public byte[] GenerateBufferFromSeed(int size)
    {
        int randomWindow = _random.Next(0, size);

        byte[] buffer = new byte[size];

        Buffer.BlockCopy(_seedBuffer, randomWindow, buffer, 0, size - randomWindow);
        Buffer.BlockCopy(_seedBuffer, 0, buffer, size - randomWindow, randomWindow);

        return buffer;
    }
}

毎回ランダムなバッファーを最初から生成するよりも約60〜70倍高速であることがわかりました。

              START: From seed buffer.
00:00:00.009  END  : From seed buffer. (Items = 5,000; Per Second = 500,776.20)
              START: From scratch.
00:00:00.604  END  : From scratch. (Items = 5,000; Per Second = 8,276.95) 

アップデート

一般的な考え方は、RandomBufferGeneratorを一度作成してから、このインスタンスを使用してランダムバッファーを生成することです。例:

RandomBufferGenerator generator = new RandomBufferGenerator(MaxBufferSize);

byte[] randomBuffer1 = generator.GenerateBufferFromSeed(10 * 1024);
byte[] randomBuffer2 = generator.GenerateBufferFromSeed(5 * 1024);
...
于 2010-06-06T18:31:52.820 に答える
3

System.Random.NextBytes()メソッドを見てください

于 2010-06-06T17:48:53.580 に答える
3

考慮すべき別のオプションとして、Marshall.AllocHGlobalアンマネージメモリを割り当てます。それはメモリをゼロにしません、あなたはそこに起こったことを手に入れるのでそれは非常に速いです。もちろん、安全でないコードを使用してこのメ​​モリを操作する必要があります。管理対象スペースにメモリをプルする必要がある場合は、を使用することをお勧めしますRandom.NextBytes

于 2010-06-06T17:55:19.783 に答える
1

データはどのくらいジャンキーである必要がありますか?ランダムですか?その場合は、Randomクラスを使用してください。

于 2010-06-06T17:49:41.420 に答える