c# - 运行最大线程 : Automatic performance adjustment

标签 c# multithreading

我正在开发一个应用程序,它可以扫描数千个结构副本; ~1 GB 内存。速度很重要。

     ParallelScan(_from, _to);  //In a new thread

我手动调整线程数:

     if (myStructs.Count == 0) { threads = 0; }
     else if (myStructs.Count < 1 * Number.Thousand) { threads = 1; }
     else if (myStructs.Count < 3 * Number.Thousand) { threads = 2; }
     else if (myStructs.Count < 5 * Number.Thousand) { threads = 4; }
     else if (myStructs.Count < 10 * Number.Thousand) { threads = 8; }
     else if (myStructs.Count < 20 * Number.Thousand) { threads = 12; }
     else if (myStructs.Count < 30 * Number.Thousand) { threads = 20; }
     else if (myStructs.Count < 50 * Number.Thousand) { threads = 30; }
     else threads = 40;

我只是从头开始写它,我需要为另一个 CPU 等修改它。我想我可以写一个更聪明的代码,如果 CPU 可用,它会动态启动一个新线程:

  • 如果CPU不是%100启动N个线程
  • 测量 CPU 或线程处理时间并修改/估计 N
  • 循环直到扫描所有结构体数组

有没有人认为“我做了类似的事情”或“我有更好的主意”?

更新:解决方案

    Parallel.For(0, myStructs.Count - 1, (x) =>
    {
         ParallelScan(x, x); // Will be ParallelScan(x);

    });

我确实修剪了大量代码。谢谢大家!

更新 2:结果

10K 模板的扫描时间

  • 1 个线程:500 毫秒
  • 10 个线程:300 毫秒
  • 40 个线程:600 毫秒
  • 任务:100 毫秒

最佳答案

标准答案:使用任务 (TPL),而不是线程。任务需要 Fx4。

您的 ParallelScan 可以只使用 Parallel.Foreach( ... ) 或 PLINQ (.AsParallel())。

TPL 框架包括一个调度器,ForEach() 使用分区器,以适应 CPU 内核和负载。您的问题很可能通过标准组件得到解决,但您可以编写自定义调度程序和分区程序。

关于c# - 运行最大线程 : Automatic performance adjustment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6911228/

相关文章:

c# - 如何为 Last.fm api 可靠地签署请求?

c# - StackExchange Redis C# 如何运行 LUA 脚本 - 需要更好的真实示例

c# - 在 C# 和 C 之间进行进程间通信的最简单方法是什么?

c++ - Boost线程问题,当一个线程与另一个线程没有相同的拷贝时如何共享变量?

java - 使用 Swing 进行线程处理

c# - 我可以在 C# 中的一行上锁定(某物)吗?

c# - 如何将匿名类型的实例转换为 NameValueCollection

c# - Linq To SQL Specified cast is not valid error with Union

java - 仅当工作线程在 Android 中完成时才在主线程中调用函数

c# - 线程安全 : Lock vs Reference