c# - 在 C# 中使用线程用随机数填充数组

标签 c# arrays multithreading random thread-safety

正如图 block 中所述,我正在尝试使用 16 个(在我的例子中)线程用随机数填充一个字节数组,现在使用一个线程填充一个包含 500000000 个字节的数组大约需要六秒半thread 所以逻辑上说使用 16 个线程至少要快 10 倍但是后来我尝试这样做,花了 15 秒来填充它,我所做的是我给每个线程一个段来填充同一个数组

代码如下:

        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

最佳答案

如果是我,我会:

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 整理成新数组所花费的时间可能会使这种方法比单线程方法更昂贵。

关于c# - 在 C# 中使用线程用随机数填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65106859/

相关文章:

c# - 使用 C# 为 Windows 设置 ipv6

c# - 在 XUnit 中运行 BenchmarkDotNet

c - 是否可以在线程中使用退出?

java - 如何中断循环内阻塞的可调用线程?

c# - 同时运行两个函数

c# - 字符串编码在数据库上失败

C# 从 C++ DLL 捕获输出

javascript - PHP foreach 与通过 AJAX 发送的多维数组的怪异

java - jTable 不断抛出 NullPointerException

Python;计算向量的元素