我正在使用它:
byte[] buffer = new byte[10240];
据我所知,这会初始化10kb的缓冲区数组,填充0s。
每次使用垃圾数据填充此数组(或初始化)的最快方法是什么?
我需要使用> 5000次这样的数组,并且每次使用不同的垃圾数据填充它,这就是为什么我正在寻找一种快速方法来实现它。数组大小也必须每次都改变。
答案 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
类。