Как заполнить массив байтов мусором?
Я использую этот:
byte[] buffer = new byte[10240];
Как я понимаю, это инициализирует буферный массив 10kb, заполненный 0s.
каков самый быстрый способ заполнить этот массив (или инициализировать его) мусорными данными каждый раз?
Мне нужно использовать этот массив как > 5000 раз и заполнять его каждый раз разными ненужными данными, поэтому я ищу быстрый метод для этого. Размер массива также должен будет меняться каждый раз.
5 ответов
Если вы довольны тем, что данные являются случайными, но создаются из случайного буфера семян, вы можете сделать следующее:
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);
...
ответ "самый быстрый способ" невозможен без описания свойств ваших нежелательных данных. Почему не все нули допустимы для нежелательных данных?
тем не менее, это быстрый способ заполнить Ваш массив бессмысленными числами.
Random r = new Random();
r.NextBytes(buffer);
вы также можете посмотреть на реализацию своего собственного линейный конгруэнтный генератор если Random
недостаточно быстро для вас. Они просты в реализации и быстры, но не дают высококачественных случайных чисел. (Это мне непонятно, нужны они тебе или нет.)
как еще один вариант для рассмотрения,Marshall.AllocHGlobal
выделит неуправляемую память. Это не обнуляет память, вы получаете то, что случилось, поэтому это очень быстро. Конечно, теперь вам придется работать с этой памятью, используя небезопасный код, и если вам нужно вытащить его в управляемое пространство, вам лучше с Random.NextBytes
.
Как junky должны быть данные? Ты имеешь в виду случайно? Если это так просто использовать Random
класса.