【问题标题】:Determining the most efficient number of threads to use depending on system specs根据系统规格确定要使用的最有效线程数
【发布时间】:2013-06-19 15:33:03
【问题描述】:

如何为给定系统确定用于操作的最大/正确线程数?我有一个可以用 1 到 100 个线程完成的操作。我可以运行一些测试并找出最有效的方法,但它似乎在很大程度上取决于用户的系统。

这是否有先例,取决于内核数量、操作系统等?

我正在使用 C#.NET,但我不确定这会有所作为。

【问题讨论】:

  • 您想根据条件(CPU 负载、内存...)为每个用户系统进行自定义吗?

标签: c# .net multithreading performance operating-system


【解决方案1】:

这没有简单的规则,这完全取决于这些线程在做什么。如果他们正在燃烧核心,那么理想的数量永远不会超过机器可用的核心数量。添加更多内容只会让操作系统在它们之间进行上下文切换。

但是,如果他们执行任何 I/O,那么他们将被阻塞很多时间,等待 I/O 完成。在这种情况下,理想值可以更大,但完全取决于 I/O 子系统中的并发性。

理想只是一个。如果线程执行完全受您的机器只有一个资源的约束,情况就是这样。就像内存总线或磁盘一样。

你必须测量。查看Amdahl's law 的维基百科文章,选择曲线变平的数字。注意缓存效果,这些效果会使您的程序看起来比实际情况要好。就像一遍又一遍地运行一个磁盘绑定的程序,实际上是从文件系统缓存而不是磁盘中获取数据。

【讨论】:

    【解决方案2】:

    在一个完美的程序中,您应该使用的线程数就是您拥有的处理器数。

    【讨论】:

    • 那么,一个完美的程序没有I/O?如果它没有 I/O,你怎么知道它是完美的?
    【解决方案3】:

    .NET 框架 4.5 中的线程池默认设置要使用的最小线程数,具体取决于此处描述的可用内核数:优化线程池部分中的http://www.albahari.com/threading/如果它认为这会带来更好的吞吐量,则会添加或退出线程。

    您还可以手动设置要使用的最小和最大线程数,在您的情况下为 1 和 100。

    文档: http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 2011-07-09
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多