C# 使用c中的线程用随机数填充数组#
如图中所述,我试图用16个线程(在我的例子中)用随机数填充一个字节数组,现在用一个线程填充一个500000000字节的数组大约需要6.5秒,所以逻辑上说使用16个线程将至少快10倍,但我试着这样做,填充它花了15秒,我做的是给每个线程一个段来填充相同的数组 代码如下:C# 使用c中的线程用随机数填充数组#,c#,arrays,multithreading,random,thread-safety,C#,Arrays,Multithreading,Random,Thread Safety,如图中所述,我试图用16个线程(在我的例子中)用随机数填充一个字节数组,现在用一个线程填充一个500000000字节的数组大约需要6.5秒,所以逻辑上说使用16个线程将至少快10倍,但我试着这样做,填充它花了15秒,我做的是给每个线程一个段来填充相同的数组 代码如下: static byte[] nums2 = new byte[500000000]; static Random rnd = new Random(123); static void
static byte[] nums2 = new byte[500000000];
static Random rnd = new Random(123);
static void fill()
{
for (int i = 0; i < nums.Length; i++)
nums[i] = (byte)rnd.Next(10);
}
static void fillPart(object ID)
{
var part = nums2.Length / Environment.ProcessorCount;
int baseN = (int)ID * part;
for (int i = baseN; i < baseN + part; i++)
nums2[i] = (byte)rnd.Next(10);
Console.WriteLine("Done! " + ID);
}
static void Main(string[] args)
{
Stopwatch watch = new Stopwatch();
watch.Start();
fill();
watch.Stop();
Console.WriteLine("it took " + watch.Elapsed);
Console.WriteLine();
watch.Reset();
watch.Start();
Thread[] threads = new Thread[Environment.ProcessorCount];
for (int i = 0; i < Environment.ProcessorCount; i++)
{
threads[i] = new Thread(fillPart);
threads[i].Start(i);
}
for(int i = 0; i < Environment.ProcessorCount; i++)
threads[i].Join();
watch.Stop();
Console.WriteLine("it took " + watch.Elapsed);
}
}```
would like to understand why is it took 15 seconds or maybe what I did wrong
static byte[]nums2=新字节[500000000];
静态随机rnd=新随机(123);
静态空隙填充()
{
对于(int i=0;i
如果是我,我会:
byte[] nums = new byte[500000000];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(nums);
就这样吧
如果您确实需要线程:
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
var dop = 8;
var batchSize = 500000000 / dop;
var bigBytes = Enumerable.Range(0, dop).AsParallel().SelectMany(t => {
var bytes = new byte[batchSize];
rng.GetBytes(bytes); //This *IS* thread-safe
return bytes;
}).ToArray();
但是我怀疑通过
SelectMany
和ToArray
将数据整理到一个新数组所花费的时间可能比单线程方法更昂贵。问题是您声明了static Random rnd=new Random(int.MaxValue)代码>
如果在fillPart
方法中创建Random
实例,则程序将在一秒钟内完成,因此notThread
中的问题是rnd。下一步(10)
static void fillPart(对象ID)
{
随机rnd=新随机(123);
var part=nums2.Length/Environment.ProcessorCount;
int baseN=(int)ID*部分;
int co=0;
对于(inti=baseN;i
在多个线程中使用相同的随机
实例是不安全的。哦,你说得对!它正在工作,只是在fillpart函数中添加了一个新的随机对象。我想知道为什么现在的问题是您可能同时创建了一组随机实例。为了使它们不会全部吐出相同的数字,你必须增加更多的复杂性,以确保它们的种子不同。这是否回答了你的问题?不,非常不!关键是要使用threads@Sinatrcool,我不知道你是如何使用threads的,但是很好!请参阅我上面关于播种随机数以使生成的数组不会重复自身的评论。我认为他的问题不在于唯一数,而在于线程性能。但你是对的,你的评论给了我灵感
static void fillPart(object ID)
{
Random rnd = new Random(123);
var part = nums2.Length / Environment.ProcessorCount;
int baseN = (int)ID * part;
int co = 0;
for (int i = baseN; i < baseN + part; i++)
{
nums2[i] = (byte)rnd.Next(10);
}
//Console.WriteLine("Done! " + ID + co);
}