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

作为另一个要考虑的选项,Marshall.AllocHGlobal将分配非托管内存。它不会将内存归零,你会知道发生了什么,所以它非常快。当然,您现在必须使用不安全代码来处理此内存,如果您需要将其拉入托管空间,您最好使用Random.NextBytes.

于 2010-06-06T17:55:19.783 回答
3

System.Random.NextBytes()方法

于 2010-06-06T17:48:53.580 回答
1

数据应该有多垃圾?你的意思是随机的吗?如果是这种情况,只需使用Random该类。

于 2010-06-06T17:49:41.420 回答