【发布时间】:2011-08-02 11:22:10
【问题描述】:
我正在开发一个应用程序,它可以扫描数千个结构副本; ~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 不是 %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 毫秒
【问题讨论】:
-
除非你有一个非常、非常、非常好的理由认为扫描这些结构需要的时间不会超过几微秒,而且这真的、真的、真的很重要,否则这不是一个好主意做这种优化。如果你真的想这样做,你应该每个核心有一个线程。但真的 - 不要。如果它只有 50,000 个结构,而您正在用它们做一些简单的事情,请不要打扰。
-
另外,您是否有一个名为
Number.Thousand的常量被定义为1000?就用1000或者叫Number.Thousand以外的名字,好像很多余? -
仅供参考,启动一个新线程需要很长时间(一秒的可测量部分,几毫秒)。
-
@Nime:你说的“容易切换”,你的意思是改变 Number.Thousand 以返回 1e6,例如?
-
如果难以阅读,请使用_。例如
int myVal = 1_000_000;工作一百万就可以了
标签: c# multithreading