7年前关闭。
我希望这不是滥用stackoverflow;最近,我在Parallel Extensions上看到了一些很棒的问题,这引起了我的兴趣。
我的问题:
您是否正在使用并行扩展,如果使用的话,如何使用?
我叫Stephen Toub,我在Microsoft的并行计算平台团队中工作。我们是负责并行扩展的小组。我总是很想听听开发人员如何利用Parallel Extensions(例如Parallel.For,PLINQ,ConcurrentDictionary等),您拥有的积极经验,您拥有的消极经验,对未来的功能要求等等。上。
如果您愿意分享此类信息,请在此处作为对此问题的答复,或者通过
stoub at microsoft dot com
电子邮件私下给我。我非常期待您的回音。
提前致谢!
最佳答案
我正在使用TPL进行嵌套的Parallel.ForEach
调用。因为我从这些调用中访问字典,所以必须使用ConcurrentDictionary
。虽然很好,但我有几个问题:ForEach
内部的代表没有做太多的工作,所以我没有太多的并行性。该系统似乎将大部分时间都花在了加入线程上。如果有一种方法可以弄清楚为什么并没有改善并发性,那就太好了。
内部的ForEach
迭代遍历ConcurrentDictionary
实例,如果我不添加枚举器缓存,则会导致系统将其大部分时间用于枚举器。
我的许多ConcurrentDictionary
实例实际上都是集合,但是没有ConcurrentSet
,所以我不得不用ConcurrentDictionary
实现自己的实例。ConcurrentDictionary
不支持对象初始化语法,所以我不能说var dict = new ConcurrentDictionary<char, int> { { 'A', 65 } };
,这也意味着我不能将ConcurrentDictionary
文字分配给类成员。
在某些地方,我必须在ConcurrentDictionary
中查找键并调用昂贵的函数来创建值(如果该值不存在)。如果有一个GetOrAdd
的addValueFactory
重载,那么只有在键不存在时才可以计算该值,这将是很好的。可以使用.AddOrUpdate(key, addValueFactory, (k, v) => v)
进行模拟,但是这会给每个查找增加额外的委托调用的开销。
关于.net - 您正在使用并行扩展吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3960269/