【问题标题】:Parallelism in C#C#中的并行性
【发布时间】:2012-05-16 12:03:13
【问题描述】:

我读到 .NET C# 内置了任务和数据并行性。如果我在具有 4 个内核(Windows 任务管理器的 4 个窗口)的计算机中的程序中运行 for/foreach 循环,循环是否会均匀分布进4核?如果不是,为什么 for/foreach 循环默认不运行在 4 核并行?

一般来说,并行性比传统编程更好吗?利大于弊吗?我正在进行大量数据处理(一堆拉取、for/foreach 循环),需要更快地完成这些 for/foreach 循环。

【问题讨论】:

标签: c# parallel-processing


【解决方案1】:

如果我在具有 4 个内核(Windows 任务管理器的 4 个窗口)的计算机中运行我的程序中的 for/foreach 循环,循环是否会均匀分布到 4 个内核中?

您的意思是任务会自动在内核上并行化吗?不可以。为此,您需要使用 Task Parallel Library,例如 Parallel.ForEach。

一般来说,并行性比传统编程更好吗?

视情况而定。

利大于弊吗?

视情况而定。

我正在进行大量数据处理(一堆拉取、for/foreach 循环)并且需要更快地完成这些 for/foreach 循环。

不要再猜测并行化是您的答案。拿出探查器,找出瓶颈在哪里。例如,如果缓慢源于必须通过网络连接与数据库通信,则并行化将无济于事。如果瓶颈是循环内的操作并且这些操作是可并行的,它可能会有所帮助。

【讨论】:

  • 数据是从 SQL Server 和 MongoDB 拉取的,所以并行性不会那么有效?您将如何优化从数据库中提取数据的场景?我正在尽可能多地进行缓存。
  • 我不知道,你没有给我足够的信息。我怀疑并行化会对你有多大帮助。你的瓶颈是数据库。但是你没有告诉我你在做什么,所以我不能肯定。
  • 它正在进行数据处理,它从 SQL Server 中提取基本索引并从 MongoDB 中获取实际对象。在 for/foreach 循环中,它反序列化对象并查看里面的对象。在循环内部,通过从数据库中获取对象的 GUID,不断地从数据库中提取对象并反序列化对象。循环终止,直到达到上限或循环所有必要的数据。
  • 我认为数据库拉取和反序列化肯定是耗时的事情。如果循环是基本的整数和字符串,它会快得多。
  • “我认为......肯定会耗费时间”对于性能问题来说是错误的句子。基本上不可能“思考”什么会更快 - 需要尝试和测量。可能的例外是代码完全使用错误的算法 - O(n^2) 而不是 O(n),但即使是这种情况,实际测量结果也可能令人惊讶。
【解决方案2】:

有一个专门用于并行处理的实现(如@xbonez 所述)。

.Net 4.0 确实有一个出色的并行库(MSDN:TPL)。

【讨论】:

    【解决方案3】:

    它没有在 4 核上运行,因为它不是每次都有效或需要。

    这取决于您的程序和程序的负载。并行化不需要 1 毫秒/周期的函数效率不高。如果您对可以拆分的大量数据进行大量长时间运行的计算或搜索,那么您可以/应该并行化您的循环。

    对于该主题,我建议阅读http://www.amazon.com/Multi-Core-Programming-Increasing-Performance-Multi-threading/dp/0976483246/ref=sr_1_fkmr0_2?ie=UTF8&qid=1336440123&sr=8-2-fkmr0

    【讨论】:

    • 不,它没有在四核上运行,因为它不是这样编码的!
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 2010-09-13
    • 2011-06-09
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多