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