Как заполнить массив байтов спамом?

Я использую это:

byte[] buffer = new byte[10240];

Поскольку я понимаю, что это инициализирует буферный массив 10 КБ, заполненных 0s.

Что самый быстрый путь состоит в том, чтобы заполнить этот массив (или инициализировать его) с данными спама каждый раз?

Я должен использовать тот массив как> 5000 раз и заполнять его каждый раз различными данными спама, вот почему я ищу быстрый метод, чтобы сделать это. Размер массива должен будет также измениться каждый раз.

20
задан John Saunders 6 June 2010 в 19:06
поделиться

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);
...
13
ответ дан 29 November 2019 в 22:52
поделиться

Ответ "самый быстрый способ" невозможен без описания свойств ваших нежелательных данных. Почему все нули не считаются нежелательными данными?

Тем не менее, это быстрый способ заполнить массив бессмысленными числами.

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

Если линейный конгруэнтный генератор недостаточно быстр для вас, вы можете также рассмотреть возможность реализации собственного случайного генератора. Они просты в реализации и быстры, но не дают высококачественных случайных чисел. (Мне неясно, нужны они вам или нет)

.
41
ответ дан 29 November 2019 в 22:52
поделиться

Посмотрите на метод System.Random.NextBytes() -

3
ответ дан 29 November 2019 в 22:52
поделиться

В качестве другого варианта, который следует рассмотреть, Marshall.AllocHGlobal будет выделять неуправляемую память. Это не обнуляет память, вы получаете то, что случилось, так что это очень быстро. Конечно, теперь вам придется работать с этой памятью, используя небезопасный код, и если вам нужно перенести его в управляемое пространство, вам лучше использовать Random.NextBytes .

3
ответ дан 29 November 2019 в 22:52
поделиться

Насколько случайными должны быть данные? Вы имеете в виду случайные? Если так, то просто используйте класс Random.

1
ответ дан 29 November 2019 в 22:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: