【问题标题】:Increase CPU utilization提高 CPU 利用率
【发布时间】:2014-12-20 21:12:41
【问题描述】:

我正在开发 WPF/C# 桌面应用程序。

我有 2 种方法(让我们调用 Tasks)。每个任务占用 10% 的 CPU,整个应用程序也占用 10%。所以,

  1. 当我在一个实例中运行这两个任务时,它会划分 CPU 利用率(每个 5%,因此显然进程会变慢)

  2. 当我运行我的应用程序的 2 个实例并在每个应用程序上运行一个任务时。一切都很好。 2 个任务的总利用率为 20%。

现在的问题是:如何在我的应用程序的一个实例中使用 20% 的 CPU 利用率?

我无法添加代码,因为创建我的应用程序的MCVE 非常复杂。

完整场景:

它是一个人脸识别应用程序。第一个 30 fps 的相机使用 10% 的 CPU。当第二个摄像头启动时,两个 fps 都下降到 15 fps,而总应用程序利用率仍然是 10%(它不会增加但会减慢任务,就像 fps 一样)。

当我运行 2 个应用程序实例时,每个实例都有 1 个摄像头。两个实例的 FPS 均为 30,CPU 利用率总计为 20%。这就是整个场景!

【问题讨论】:

  • 了解如何控制 fps 很重要。是否有任何轮询或事件触发?
  • 每次新帧到来时,它都会触发一个事件,然后在事件处理程序中传递给人脸检测和识别方法,最后将图像分配给imagebox
  • 您是否同步处理您的事件?请给我们看一点代码。
  • 好的。我尝试创建一个示例

标签: c# wpf parallel-processing cpu-usage


【解决方案1】:

首先,CPU 使用率取决于您在异步运行的方法中执行的操作。如果有操作正在等待外部资源的到来(例如,如果您有线程从 Internet 获取数据),或者如果有很多 I/O 操作,那么 CPU 使用率可能不会很高,因为线程主要等待数据到来而不是进行计算。当您执行大量计算操作时,您可以预期线程上的 CPU 使用率很高。您可能会更改异步运行的代码以增加 CPU 使用率 - 这是一个非常笼统的评论,但由于我们没有看到您的代码,因此无法给出其他评论。

其次-如果您在代码中直接使用Threads,那么Priority 类上有一个Priority 属性,您可以尝试增加它-但您不能保证CPU 使用率会增加.还要为线程设置高优先级以增加 CPU 使用率,您需要记住,您冒着在同一台机器上运行的其他应用程序可能会“饿死”的风险(即它们的性能会因为您的代码而降低) .

【讨论】:

  • 我没有使用任何可能很慢的异步进程,我已经解释了一些关于该场景的内容。我希望现在能更容易理解这个问题。
  • 嗯,在您编辑之后,这与以前不同了。但我们不知道您如何处理应用程序中来自摄像头的数据。你说的两种方法,你怎么知道它们每个都占用 10% 的 CPU?听起来他们正在并行工作。你怎么称呼这两种方法?没有片段代码,我无法提供更多建议。
  • 我希望我可以创建最小的工作示例。我提到这是两个tasks 我正在处理相机。实际上使用并不重要。但是无论我在问题中解释的是我的分析,我已经在几乎 4 到 5 个不同的配置系统上检查了所有内容(每个系统上的利用率百分比变化,但两个进程保持相同)并且每个系统上的 fps 下降到 15。
  • 我真的帮不了你,因为你没有提供基本信息来帮助你。你说“任务”,如果你使用 System.Threading.Tasks.Task 和异步,那么我不知道是否有办法增加 CPU 使用率。使用 Thread 类,您可以按照我在回答中所写的那样做。如果您使用不同的编程解决方案来处理相机数据 - 我不知道。
  • 我正在使用Parallel.Invoke 调用一个方法来启动相机并开始从中抓取帧。