如何为给定系统确定用于操作的最大/正确线程数?我有一个可以用 1 到 100 个线程完成的操作。我可以运行一些测试并找出最有效的方法,但它似乎在很大程度上取决于用户的系统。
是否有先例,取决于内核数量、操作系统等?
我在 C#.NET 中工作,但我不确定这会有所作为。
如何为给定系统确定用于操作的最大/正确线程数?我有一个可以用 1 到 100 个线程完成的操作。我可以运行一些测试并找出最有效的方法,但它似乎在很大程度上取决于用户的系统。
是否有先例,取决于内核数量、操作系统等?
我在 C#.NET 中工作,但我不确定这会有所作为。
这没有简单的规则,这完全取决于这些线程在做什么。如果他们正在燃烧核心,那么理想的数量永远不会超过机器可用的核心数量。添加更多只是给操作系统额外的工作来在它们之间进行上下文切换。
但是如果他们执行任何 I/O,那么他们将被阻塞很多时间,等待 I/O 完成。在这种情况下,理想值可以更大,但完全取决于 I/O 子系统中的并发性。
并且并不罕见地理想只是一个。如果线程执行完全受您的机器只有一个资源的约束,情况就是这样。就像内存总线或磁盘一样。
你必须测量。查看阿姆达尔定律的 Wikipedia 文章,选择曲线变平的数字。注意缓存效果,这些效果会使您的程序看起来比实际情况要好。就像一遍又一遍地运行磁盘绑定程序并实际从文件系统缓存而不是磁盘获取数据。
在一个完美的程序中,您应该使用的线程数就是您拥有的处理器数。
.NET 框架 4.5 中的线程池默认设置要使用的最小线程数,具体取决于此处描述的可用内核数:http ://www.albahari.com/threading/在优化线程池部分和如果它认为这将导致更好的吞吐量,它将添加或退出线程。
您还可以手动设置要使用的最小和最大线程数,在您的情况下为 1 和 100。
文档:http: //msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx