我试图找到使用C#4.0线程循环的好方法。假设我现在有两个宽度/高度为8/5的多维数组,即每个数组中有40个元素。
通过我目前正在优化的一段代码,我遇到了几次这样的情况,我只是将元素乘以元素这样的两个表(使用嵌套循环)
是否值得使用4.0的线程循环?如果没有,使用与否的良好做法/规模估计是什么?
亲切的问候,
答案 0 :(得分:5)
多线程嵌套循环的挑战是将工作和数据分离到独立的池中。如果你的循环在数组进展过程中修改了数组,那么当拆分为多个线程时,这将无法正常工作。如果您已经设置了循环以使输入数据是只读的,并且循环的输出进入不同的数据结构,那么就有希望进行多线程处理。只读输入+本地化输出适用于多线程。
还有每个循环迭代中发生了多少工作的问题。你不会从多线程中获得很多好处,这个循环每次迭代都很少。小型快速循环中的大多数挂钟时间将用于循环管理,而不是工作本身,并且使循环多线程只会增加循环管理开销。如果你的循环每次迭代都做了非常重要的工作,你就有更好的机会从多线程中获益。
如果每次迭代工作包括阻塞操作(如文件I / O),您可能会认为对循环进行多线程处理会改进。在许多情况下,对文件I / O绑定循环进行多线程处理只会使事情变得更糟。这些文件I / O另一端的硬件设备通常不能更快地移动物理读/写头,因此要求它同时做更多的事情是不会有任何好处的。在尝试多线程循环之前,您可能最好调查使用异步文件I / O.
最后,不要在猜测多线程可能有用的地方做任何这些。在多线程之前和之后测量代码的性能。如果你找不到多线程有显着改进的情况,那么就不要这样做。为了有时获得微小的改善,这不值得额外的努力和风险。