18

我已经用 C# 构建了一个应用程序,我希望针对多核进行优化。我有一些线程,我应该做更多吗?

更新了更多细节

  • C# 2.0
  • 在 Windows Vista 和 Windows Server 2003 上运行

再次更新

  • 此代码作为服务运行
  • 我不想拥有完整的代码......我的目标是获得您的经验以及如何开始。就像我说的,我已经使用过线程。我还能做什么?
4

6 回答 6

48

我概括地说,编写一个高度优化的多线程进程比仅仅在混合中加入一些线程要困难得多。

我建议从以下步骤开始:

  1. 将您的工作负载拆分为离散的并行可执行单元
  2. 测量和表征工作负载类型——网络密集型、I/O 密集型、CPU 密集型等——这些成为您的工作池策略的基础。例如,对于网络密集型应用程序,您可以拥有相当大的工作人员池,但是对于 CPU 密集型任务来说,拥有比硬件线程更多的工作人员是没有意义的。
  3. 考虑使用队列/数组或 ThreadWorkerPool 来管理线程池。前者比后者控制得更细。
  4. 如果可以的话,学习更喜欢异步 I/O 模式而不是同步模式 - 释放更多 CPU 时间来执行其他任务。
  5. 努力消除或至少减少围绕争用资源(如磁盘)的序列化。
  6. 最小化 I/O,在尽可能短的时间内获取并保持最低级别的锁。(读/写锁是你的朋友)
    5.梳理代码以确保资源以一致的顺序锁定,以尽量减少致命的拥抱。
  7. 疯狂地测试——多线程应用程序中的竞争条件和错误很难解决——通常你只能看到大屠杀的法医后果。

请记住,多线程版本的性能完全有可能比同一个应用程序的单线程版本更差。良好的工程测量没有任何借口。

于 2008-09-23T21:06:30.470 回答
8

您可能想看看 .NET 的并行扩展

http://msdn.com/concurrency

于 2008-09-23T20:57:22.410 回答
8

您可能想阅读 Herb Sutter 的专栏 'Effective Concurrency'。您可以在这里找到这些文章,以及其他文章。

于 2008-09-23T21:06:28.647 回答
6

为了能够更有效地利用多个内核,您应该将您的工作分成可以并行执行的部分,并使用线程将工作分配给内核。您可以使用线程、后台工作者、线程池等

于 2008-09-23T20:58:40.113 回答
5

对于 C#,开始学习 LINQ 做事方式,然后使用Parallel LINQ库及其 .AsParallel() 扩展。

于 2008-09-23T20:56:55.797 回答
2

了解您要解决的问题、应用程序及其算法中的并行性(或潜在的并行性)比线程同步、库等的任何细节都重要得多。

首先阅读Patterns for Parallel Programming(侧重于“发现并发”和更高级别的设计问题),然后继续阅读The Art of Multiprocessor Programming(从理论基础开始的实际细节)。

于 2008-09-23T21:09:58.090 回答