我有一个List< byte []>我喜欢将每个byte []反序列化为Foo.列表是有序的,我喜欢写一个并行循环,其中得到的List< Foo>包含与原始byte []相同顺序的所有Foo.该列表非常大,可以使并行操作变得有价值.有没有内置的方法来实现这一目标?
如果没有,任何想法如何实现同步运行这一切的加速?
谢谢
解决方法
从你给出的信息中,我知道你想要一个Foo的输出数组,其大小等于输入的字节数组?它是否正确?
如果是这样,是的,操作很简单.不要理会锁定或同步构造,这些会侵蚀并行化带给您的所有速度.
相反,如果遵守这个简单的规则,任何算法都可以并行化,而无需锁定或同步:
For each input element X[i] processed,you may read from any input element X[j],but only write to output element Y[i]
查找Scatter / Gather,这种类型的操作称为聚集,因为只写入一个输出元素.
如果你可以使用上面的原则,那么你想要在前面创建输出数组Foo [],并在输入数组上使用Parallel.For not ForEach.
例如.
List<byte[]> inputArray = new List<byte[]>(); int[] outputArray = new int[inputArray.Count]; var waitHandle = new ManualResetEvent(false); int counter = 0; Parallel.For(0,inputArray.Count,index => { // Pass index to for loop,do long running operation // on input items // writing to only a single output item outputArray[index] = DoOperation(inputArray[index]); if(Interlocked.Increment(ref counter) == inputArray.Count -1) { waitHandle.Set(); } }); waitHandler.WaitOne(); // Optional conversion back to list if you wanted this var outputList = outputArray.ToList();
原文地址:https://www.jb51.cc/csharp/91970.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。