C#4.0多线程循环:何时使用,何时不使用

本文关键字:何时不 何时使 多线程 循环 C#4 | 更新日期: 2023-09-27 18:25:22

我正在努力寻找使用C#4.0线程循环的好方法。假设我现在有两个多维数组,宽/高8/5,即每个数组中有40个元素。

通过我目前正在优化的一段代码,我遇到过几次这样的情况,我只是逐个元素相乘,比如两个表(使用嵌套循环)

对于这样的事情,使用4.0的线程循环值得吗?如果没有,使用或不使用它的良好做法/规模估计是什么?

亲切问候,

C#4.0多线程循环:何时使用,何时不使用

多线程嵌套循环的挑战是将工作和数据分离到独立的池中。如果循环在遍历数组的过程中修改数组,那么在拆分为多个线程时,这将不会很好地工作。如果您已经设置了循环,使得输入数据是只读的,并且循环的输出进入不同的数据结构,那么多线程是有希望的。只读输入+本地化输出有利于多线程。

还有一个问题是在每个循环迭代中发生了多少工作。对每次迭代只执行很少操作的循环进行多线程处理不会给您带来太多好处。小型快速循环中的大部分挂钟时间将用于循环管理,而不是工作本身,使循环多线程只会增加循环管理开销。如果您的循环每次迭代都要做大量的工作,那么您更有可能看到多线程带来的好处。

如果每次迭代的工作包括诸如文件I/O之类的阻塞操作,那么您可能会认为对循环进行多线程处理会有所改进。在许多情况下,对文件I/O绑定循环进行多线程处理只会使情况变得更糟。位于这些文件I/O另一端的硬件设备通常无法更快地移动物理读/写头,因此要求它同时做更多的事情不会有任何好处。在尝试对循环进行多线程处理之前,最好先研究一下使用异步文件I/O。

最后,不要基于猜测多线程可能有什么帮助来做这些事情。在多线程处理之前和之后测量代码的性能。如果你找不到多线程有显著改进的情况,那就不要这样做。有时仅仅为了获得边际改进而付出额外的努力和风险是不值得的。