私はこれを使用しています:
byte[] buffer = new byte[10240];
私が理解しているように、これは0で満たされた10kbのバッファ配列を初期化します。
この配列を毎回ジャンクデータで埋める(または初期化する)最も速い方法は何ですか?
その配列を5000回以上使用し、毎回異なるジャンクデータで埋める必要があるため、高速な方法を探しています。配列サイズも毎回変更する必要があります。
私はこれを使用しています:
byte[] buffer = new byte[10240];
私が理解しているように、これは0で満たされた10kbのバッファ配列を初期化します。
この配列を毎回ジャンクデータで埋める(または初期化する)最も速い方法は何ですか?
その配列を5000回以上使用し、毎回異なるジャンクデータで埋める必要があるため、高速な方法を探しています。配列サイズも毎回変更する必要があります。
ジャンクデータのプロパティを説明せずに「最速の方法」に答えることは不可能です。すべてのゼロが有効なジャンクデータではないのはなぜですか?
とはいえ、これは配列を無意味な数値で埋める高速な方法です。
Random r = new Random();
r.NextBytes(buffer);
速度が十分でない場合は、独自の線形合同法の実装を検討することもできます。Random
実装は簡単で高速ですが、高品質の乱数は得られません。(それらが必要かどうかは私にはわかりません。)
データがランダムであることに満足しているが、ランダムシードバッファーから作成されている場合は、次のようにすることができます。
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);
...
System.Random.NextBytes()
メソッドを見てください
考慮すべき別のオプションとして、Marshall.AllocHGlobal
アンマネージメモリを割り当てます。それはメモリをゼロにしません、あなたはそこに起こったことを手に入れるのでそれは非常に速いです。もちろん、安全でないコードを使用してこのメモリを操作する必要があります。管理対象スペースにメモリをプルする必要がある場合は、を使用することをお勧めしますRandom.NextBytes
。
データはどのくらいジャンキーである必要がありますか?ランダムですか?その場合は、Random
クラスを使用してください。