【问题标题】:C# Application - Reduce CPU UsageC# 应用程序 - 减少 CPU 使用率
【发布时间】:2026-02-08 02:00:01
【问题描述】:

我有一个多线程 C# 应用程序,其中核心逻辑位于 Timer.Elapsed 事件处理程序中。事件处理程序包含 2 个 for 循环,最多执行 n * n = 5 * 5 = 25 times

该应用程序在我的电脑上运行良好。我在 20% 的应用程序和 CPU 使用率平均值上运行 VS 2010 Profiler

公司测试人员说,在他的 PC 上,这在他的 PC 上跳跃到 50%100% 之间个人电脑。这给他带来了性能问题。

  • 有什么办法可以解决这个问题吗?
  • 高 CPU 使用率究竟意味着什么?
  • 这会影响他的电脑吗?
  • 是否可以告诉应用程序仅使用 X 数量 CPU?

任何帮助将不胜感激。

【问题讨论】:

  • 循环执行的次数只意味着它执行的上下文。如果您执行 25 次昂贵的操作,这可能是一个大问题。如果总和为 25 则无关紧要。
  • 你的计时器多久触发一次?您是等待操作完成后再重新启动计时器,还是不顾前一个循环是否完成而一次又一次地启动循环?
  • 定时器每秒执行一次。在计时器事件处理程序中,我在第一行代码中停止计时器并在最后一行代码中重新启动它。实际上,这只会在事件之间产生 1 秒的延迟。启动和停止计时器之间的代码在内存中对 ConcurrentDictionary 进行一些计算,这些计算可能会大幅增长。计算非常简单,但基于大量数据。此事件处理程序中不会发生与 UI 的交互,因此我没有使用 DispatcherTimer 或 BackgroundWorker。 ConcurrentDictionary 由各种事件更新。
  • 我最初将这段代码放在一个线程中,它有一个while循环,循环一个循环控制变量,即while(variable) { //Some Code }。这种方法效率较低,因为它消耗了更多资源。因此我切换到一个计时器,这降低了 CPU 的使用率。

标签: c# performance for-loop cpu-usage


【解决方案1】:
  • 减少运行计时器事件的频率
  • 在工作线程上执行工作(因此 UI 至少是响应式的)
  • 在计时器中做更少的工作(或更有效地做)
  • 获得更多 CPU

我猜你的意思是第三个项目符号,但我们无法在不知道代码在做什么的情况下回答这个问题;但是(没有任何上下文的随机建议):

  • 查看任何集合访问权限,看看是否有存放字典、哈希集或类似内容的位置
  • 检查您是否正在执行大量可以减少的 IO(尤其是对数据库)
  • 通过Invoke(或 UI 的等效项)检查您是否要进行大量线程切换

【讨论】:

    【解决方案2】:

    您处于好奇和猜测模式。忘记 CPU 百分比。专业人士所做的是找出该计划花费时间的原因以及是否有必要。

    您可以做的就是在一个长循环中完全运行该代码,然后对其进行采样。 I use this method. 堆栈样本将优先降落在调用树的重分支中。 很有可能你可以砍掉一些繁重的分支并获得不错的加速。

    【讨论】:

    • @c0D3l0g1c:这是关于 CPU 使用率的问题。 CPU 一直在执行。当它不执行实际代码时,它正在执行空闲进程。使用只是实际代码中所用时间的短期平均运行时间。当您的进程等待 I/O 时,它没有运行,因此显示为较低的使用率。如果它是嘎吱嘎吱的,它会更高。它与代码的效率关系不大。要做的就是我所说的。基本上,通过找到可以修剪的调用树的繁重分支来找出线索。
    • 谢谢,有道理!您上一篇文章中的文章很有用。
    • @c0D3l0g1c:不客气,传播这个词。性能调优简单。发现错误很困难,因为您必须一直跟踪,直到程序出错。但是要找到“瓶颈”,基本上,你只需暂停它(几次),看看它在做什么。
    【解决方案3】:

    只需在 for 循环中添加 Thread.Sleep(1);。这可以稳定 CPU 使用率并限制以最大速度使用 CPU。

    【讨论】:

      【解决方案4】:

      可能是您的应用程序运行多个线程。我有运行多个线程的相同问题,并且在每个线程中都有持续更新,这使得应用程序使用率从 50% 提高到 100%。

      在调查了这个问题之后,我刚刚介绍了线程(Thread(100))连续循环的延迟。这使应用程序使用率恢复到 1% 到 3%。

      【讨论】:

        【解决方案5】:

        添加 Thread.Sleep(int);在代码中减少cpu时间。即使是 30 毫秒也可以节省处理器的能量。

        【讨论】: