为了防止线程在循环中处理数据时占用CPU时间,我见过(并且已经使用过自己)的常见模式看起来像这样:
foreach (itemInACollection)
{
// do some processing on the item
// ...
// ...
Thread.Sleep(1);
}
我不是特别喜欢这个解决方案,并希望找到一种更好的方法来完成同样的事情。
我的问题是双重的,第一个涉及现有代码库,不适合进行太多改动,第二个涉及构建新解决方案。
*注意:我意识到不同的数据类型可能有不同的解决方案更适合它们的实现(和容器类型),但我想知道是否有更好的模式来处理对象的集合(例如数组)。 / p>
答案 0 :(得分:2)
为什么你的线程不应该首先占用CPU? 线程是一个(内存)昂贵的对象,运行它,然后放弃它。
管理系统资源并不是您的项目处理代码的责任。
如果遇到性能问题,应将此管理转移到调用此代码的代码。
当简单地处理独立项时,Parallel.ForEach可能是一个不错的选择。当你可以使用所有这些时,为什么只需要1个CPU。
答案 1 :(得分:1)
问题非常广泛。我会给你一些指示:
了解CPU消耗的来源。绝大多数将是缓存未命中和内存访问成本,不指令执行。请参阅CPU Caches and Why You Care - Scott Meyers
限制流程可用资源。使用Job Object,设置CPU limit,然后在此作业中启动该过程。这将由OS强制执行,并且该过程不能超过设定的限制(其线程将不会由OS调度)。一个相当于穷人的人是start /low
。
阅读本系列文章:Designing Applications for High Performance,Part 2和Part 3。
了解如何分析应用以识别瓶颈:Beginners Guide to Performance Profiling。
答案 2 :(得分:1)
如果你有很多工作要做,你应该这样做。这通常不会产生任何问题,因此通常无需解决。