执行期间 CPU 使用率变得非常高

Posted

技术标签:

【中文标题】执行期间 CPU 使用率变得非常高【英文标题】:CPU Usage Becomes Very High During Execution 【发布时间】:2010-11-18 21:22:02 【问题描述】:

我最近构建了一个使用单线程定期处理信息的服务。该服务是使用 Microsoft Visual Studio 2010 Express 构建的。我注意到 CPU 使用率飙升(CPU 使用率达到 100%)。

后来,出于好奇,我构建了一个非常小的程序,它所做的只是启动一个小线程或计时器,然后运行一些非常长的循环。我还从构建控制台应用程序切换到了 Windows 窗体应用程序。通过切换要构建的程序类型,我能够减少麻烦。

我试过降低线程的优先级:

System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest;

我也试过设置优先级

Process p = Process.GetCurrentProcess();
p.PriorityClass = ProcessPriorityClass.BelowNormal;

我还认为由于在虚拟机上运行,​​CPU 使用率可能很高。但这个理论并没有把我带到任何地方。这很荒谬。我不知道还能转向哪里。我不确定为什么启动计时器或线程会像在 .NET 框架中那样将我的 CPU 使用率发送到天花板。我在构建 COM 对象时从未遇到过这种情况。有人对我可以转向哪里有什么好主意吗?

提前感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

听起来您的代码正在无限循环,并且出乎意料。

在 Visual Studio 调试器中启动它,当你看到高 CPU 时,点击“Break”暂停执行。当您重复执行此操作时,您看到的调用堆栈和其他程序状态应该让您了解您的逻辑出了什么问题。

在调试器中单步执行代码可能会更快。这取决于代码的复杂程度。

【讨论】:

【参考方案2】:

如果您在线程中重复循环,则肯定会导致 CPU 使用率过高。您是否尝试过在循环之间为线程执行添加暂停?

Thread.Sleep(1000);

【讨论】:

Thread.Sleep(1000) 帮助我理解了一切。真正的程序有些复杂。这是我写的非常小的程序的一部分: System.Threading.Thread th = new System.Threading.Thread(new ThreadStart(ThreadFunc)); th.Priority = ThreadPriority.Lowest; th.Start();公共静态无效 ThreadFunc() System.Threading.Thread.Sleep(10000);或 (long i = 0; i 原始程序的目的是处理信息,但它必须经常运行(例如 1/2 小时或一小时)。我看到 Windows 计划程序只允许我每天安排一次任务。我以为我会使用线程来跟踪日程安排,但我开始感觉到这并不是很聪明。所以我愿意接受建议。 我想我可以转而使用 Windows 任务计划程序,而不是尝试做自己的事情并使用线程和计时器来保持我的程序轻量级。谢谢大家,很好看。 怎么样:Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal; 我记得尝试过。它似乎没有任何效果。鉴于该特定项目的性质,即定期运行,我想我最终通过 Windows 任务计划程序安排了一项任务。我相信我也能够减少 CPU 使用率。我必须追踪项目 + 以及我启动此线程的时间并分享一些源代码以希望对某人有所帮助。

以上是关于执行期间 CPU 使用率变得非常高的主要内容,如果未能解决你的问题,请参考以下文章

Daphne 使用通道 2 和 Redis 层的 CPU 使用率高

instrument之Time Profiler总结

正则表达式变得疯狂:java.util.regex.Pattern 匹配器进入高 CPU 循环

java cpu占用高,该怎么处理

CPU占用率突然间变高了怎么办

最简单的动画会导致高 CPU 使用率和非常高的能量影响 SpriteKit