Tag: 并行处理

Parallel.For和For产生不同的结果

如果我运行此测试: var r = new Random(); var ints = new int[13]; Parallel.For(0, 2000000, i => { var result = r.Next(1, 7) + r.Next(1, 7); ints[result] += 1; }); 我得到以下结果: 2: 92,14445 3: 0,41765 4: 0,62245 5: 0,82525 6: 1,04035 7: 1,25215 8: 1,0531 9: 0,8341 10: 0,6334 11: 0,4192 12: 0,2109 当我使用常规For: for (int i […]

如果我等待已经运行或运行的任务会发生什么?

有一个Task变量,让我们说现在正在运行任务..通过执行以下行。 await _task; 我想知道当我编写这段代码时会发生什么: await _task; await _task; 它会执行两次任务吗? 或抛出exception,因为它已经运行?

并行应用程序的Mutable与Immutable

在我写的应用程序中,我需要编写许多基类型,这很可能是不可变的。 但我想知道可变类型在并行应用程序中如何与不可变类型进行比较。 你可以使用带有可变对象的锁,对吗? 它与并行应用程序中与不可变类型一起使用的其他技术相比如何? 你至少不使用具有不可变类型的锁,对吧?

如何在Parallel.For中配置最大线程数

这是microsoft为并行提供的示例,我想知道如何为此代码配置最大线程数。 // A basic matrix multiplication. // Parallelize the outer loop to partition the source array by rows. System.Threading.Tasks.Parallel.For(0, matARows, i => { for (int j = 0; j < matBCols; j++) { // Use a temporary to improve parallel performance. double temp = 0; for (int k = 0; k < matACols; k++) { […]

拨打许多网络服务的最佳方式?

我有30家子公司,每家公司都实施了他们的网络服务(使用不同的技术)。 我需要实现一个Web服务来聚合它们,例如,所有子公司Web服务都有一个名为GetUserPoint(int nationalCode)的Web方法,我需要实现我的Web服务,它将调用所有这些并收集所有的回复(例如积分总和)。 这是我的基类: public abstract class BaseClass { // all same attributes and methods public long GetPoint(int nationalCode); } 对于每个子公司Web服务,我实现了一个inheritance此基类并定义自己的GetPoint方法的类。 public class Company1 { //implement own GetPoint method (call a web service). } 至 public class CompanyN { //implement own GetPoint method (call a web service). } 所以,这是我的网络方法: [WebMethod] public long MyCollector(string nationalCode) { […]

解析大字符串的最快方法(multithreading)

我即将开始一个项目,它将获取文本块,将大量数据解析为某种对象,然后可以对其进行序列化,存储和统计/数据收集。 这需要尽可能快,因为我需要启动超过10,000,000个文本块,并且每天将获得100,000个成千上万的文本。 我在具有12个核心+超线程的系统上运行它。 我也可以访问/了解CUDA编程,但对于字符串的东西认为它不合适。 从每个字符串我需要解析大量的数据,其中一些我知道确切的位置,有些我不知道,需要使用正则表达式/智能的东西。 所以考虑这样的事情: object[] parseAll (string [] stringsToParse) { parallel foreach parse( string[n] ) } object parse(string s) { try to use exact positions / substring etc here instead of regex’s } 所以我的问题是: 使用正则表达式来减少多少速度。 .NET会比其他语言慢得多吗? 我可以做什么样的优化(如果有的话)来最大化并行性。 还有什么我还没考虑过吗? 谢谢你的帮助! 对不起,如果这是漫长的啰嗦。

什么时候会并行提高性能

我试图理解何时使用parallel会提高性能。 我使用在List中运行超过100,000个项目的简单代码对其进行了测试,并将每个项目的名称更改为string.Empty 。 并行版本比普通版本花费了两倍的时间。 (是的,我测试了更多的核心…) 我看到这个答案说一段并不总是并行的数据对性能有好处。 此外,在MSDN教程的并行示例的每一页中都会重复此注意事项: 这些示例主要用于演示用法,可能会或可能不会比等效的LINQ to Objects查询运行得更快 我需要一些规则和提示,当并行将提高我的代码的性能,什么时候不会。 显而易见的答案是“测试你的代码,如果并行循环更快地使用它”,这是绝对正确的,但我想没有人在他写的每个循环上运行性能分析。

了解VS2010 C#并行分析结果

我有一个程序有很多独立的计算,所以我决定并行化它。 我使用Parallel.For / Each。 双核机器的结果还可以 – 大多数时候CPU利用率约为80%-90%。 然而,使用双Xeon机器(即8个内核),我只获得了大约30%-40%的CPU利用率,尽管该程序在并行部分上花费了相当多的时间(有时超过10秒),我看到它使用了与串行部分相比,这些部分中大约有20-30个线程。 每个线程需要1秒以上才能完成,因此我认为没有理由不能并行工作 – 除非存在同步问题。 我使用了VS2010的内置分析器,结果很奇怪。 即使我只在一个地方使用锁,分析器报告大约85%的程序时间花在同步上(5-7%睡眠,5-7%执行,1%IO)。 锁定的代码只是一个缓存(字典)get / add: bool esn_found; lock (lock_load_esn) esn_found = cache.TryGetValue(st, out esn); if(!esn_found) { esn = pData.esa_inv_idx.esa[term_idx]; esn.populate(pData.esa_inv_idx.datafile); lock (lock_load_esn) { if (!cache.ContainsKey(st)) cache.Add(st, esn); } } lock_load_esn是Object类的静态成员。 esn.populate使用单独的StreamReader为每个线程从文件中读取。 但是,当我按下同步按钮以查看导致最大延迟的原因时,我看到探查器报告的是function入口线,并且不会报告锁定的部分本身。 它甚至没有报告包含上述代码的function(提醒 – 程序中唯一的锁定 )作为阻塞配置文件的一部分,噪声级别为2%。 当噪音水平为0%时,它会报告程序的所有function,我不明白为什么它们被视为阻塞同步。 所以我的问题是 – 这里发生了什么? 如何将85%的时间用于同步? 如何找出程序中并行部分的问题? 谢谢。 更新 […]

Task.WaitAll和Exceptions

我有exception处理和并行任务的问题。 下面显示的代码启动2个任务并等待它们完成。 我的问题是,如果任务抛出exception,则永远不会到达catch处理程序。 List tasks = new List(); try { tasks.Add(Task.Factory.StartNew(TaskMethod1)); tasks.Add(Task.Factory.StartNew(TaskMethod2)); var arr = tasks.ToArray(); Task.WaitAll(arr); } catch (AggregateException e) { // do something } 但是,当我使用以下代码等待超时的任务时,会捕获exception。 while(!Task.WaitAll(arr,100)); 我似乎错过了一些东西,因为WaitAll的文档描述了我的第一次尝试是正确的。 请帮助我理解它为什么不起作用。

用于C#的快速线程安全随机数发生器

我需要在多个正在运行的线程中快速生成随机浮点数。 我尝试过使用System.Random ,但它对我的需求来说太慢了,它在多个线程中返回相同的数字。 (当我在一个线程中运行我的应用程序时,它工作正常。)另外,我需要确保生成的数字在0到100之间。 这就是我现在正在尝试的事情: number = random.NextDouble() * 100; 我该怎么办呢?