我在C#中构建了一个应用程序,我希望针对多个内核进行优化.我有一些线索,我应该做更多吗?
更新了更多细节
C#2.0
在Windows Vista和Windows Server 2003上运行
再次更新
此代码作为服务运行
我不想拥有完整的代码......我的目标是获得您的经验以及如何开始.就像我说的,我已经使用过线程.我还能做什么?
stephbu.. 46
我总结说,编写高度优化的多线程进程要比在混合中抛出一些线程要困难得多.
我建议从以下步骤开始:
将工作负载拆分为离散的并行可执行单元
衡量和表征工作负载类型 - 网络密集型,I/O密集型,CPU密集型等 - 这些成为您的工作池合并策略的基础.例如,对于网络密集型应用程序,您可以拥有相当大的工作池,但对于CPU密集型任务而言,拥有更多工作者而不是硬件线程是没有意义的.
考虑排队/数组或ThreadWorkerPool来管理线程池.前者比后者控制更细粒度.
如果可以的话,学习优先于同步模式的异步I/O模式 - 释放更多的CPU时间来执行其他任务.
努力消除或至少减少围绕竞争资源(如磁盘)的序列化.
最小化I/O,获取并保持最低级别的锁定,以尽可能减少时间.(读者/作者锁定是你的朋友)
5.通过该代码来确保资源以一致的顺序锁定,以最大限度地减少致命的拥抱.
像疯了一样进行测试 - 多线程应用程序中的竞争条件和错误对于排除故障是很糟糕的 - 通常你只能看到大屠杀的法医后果.
请记住,多线程版本完全有可能比同一个应用程序的单线程版本更糟糕.良好的工程测量没有任何借口.
我总结说,编写高度优化的多线程进程要比在混合中抛出一些线程要困难得多.
我建议从以下步骤开始:
将工作负载拆分为离散的并行可执行单元
衡量和表征工作负载类型 - 网络密集型,I/O密集型,CPU密集型等 - 这些成为您的工作池合并策略的基础.例如,对于网络密集型应用程序,您可以拥有相当大的工作池,但对于CPU密集型任务而言,拥有更多工作者而不是硬件线程是没有意义的.
考虑排队/数组或ThreadWorkerPool来管理线程池.前者比后者控制更细粒度.
如果可以的话,学习优先于同步模式的异步I/O模式 - 释放更多的CPU时间来执行其他任务.
努力消除或至少减少围绕竞争资源(如磁盘)的序列化.
最小化I/O,获取并保持最低级别的锁定,以尽可能减少时间.(读者/作者锁定是你的朋友)
5.通过该代码来确保资源以一致的顺序锁定,以最大限度地减少致命的拥抱.
像疯了一样进行测试 - 多线程应用程序中的竞争条件和错误对于排除故障是很糟糕的 - 通常你只能看到大屠杀的法医后果.
请记住,多线程版本完全有可能比同一个应用程序的单线程版本更糟糕.良好的工程测量没有任何借口.
您可能想看一下.NET的并行扩展
http://msdn.com/concurrency
您可能想阅读Herb Sutter的专栏"Effective Concurrency".你会在这里和其他人一起找到这些文章.
为了能够更有效地利用多个内核,您应该将您的工作分成可以并行执行的部分,并使用线程将工作分配到内核上.您可以使用线程,后台工作程序,线程池等
对于C#,开始学习LINQ方式,然后使用Parallel LINQ库及其.AsParallel()扩展.