如何用垃圾填充字节数组?

时间:2010-06-06 17:45:09

标签: c# arrays bytearray bytebuffer

我正在使用它:

byte[] buffer = new byte[10240];

据我所知,这会初始化10kb的缓冲区数组,填充0s。

每次使用垃圾数据填充此数组(或初始化)的最快方法是什么?

我需要使用> 5000次这样的数组,并且每次使用不同的垃圾数据填充它,这就是为什么我正在寻找一种快速方法来实现它。数组大小也必须每次都改变。

5 个答案:

答案 0 :(得分:39)

如果不描述垃圾数据的属性必须回答'最快的方法'是不可能的。为什么并非所有零都是有效的垃圾数据?

也就是说,这是一种用无意义的数字填充数组的快速方法。

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

如果Random不够快,您也可以考虑实施自己的Linear congruential generator。它们易于实现且速度快,但不会提供高质量的随机数。 (如果你需要或不需要,我不清楚。)

答案 1 :(得分:13)

如果您对数据是随机的,但是从随机种子缓冲区创建,那么您可以执行以下操作:

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);
...

答案 2 :(得分:3)

答案 3 :(得分:3)

作为另一个需要考虑的选项,Marshall.AllocHGlobal将分配非托管内存。它没有将内存归零,你得到的是那里发生的事情,所以它非常快。当然,您现在必须使用不安全的代码处理此内存,如果您需要将其拉入托管空间,最好使用Random.NextBytes

答案 4 :(得分:1)

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