我的应用程序占用大量 CPU.C#.

本文关键字:CPU 应用程序 我的 | 更新日期: 2023-09-27 17:49:15

我有一个应用程序循环从实时URL接收的XML。XML在几微秒内收到,然后我通过循环进行处理。

我的客户说应用程序非常占用 CPU。

想知道我是否可以以某种方式降低其 CPU 使用率?应用程序本身并不大,它只是XML字段和常规if条件上的一个大循环。

foreach (XmlNode childNode in childNodes)
                {
                    if (childNode.Name == "update_status")
                    {
                        update_status = childNode.InnerText;
                    }
                    if (childNode.Name == "title")
                    {
                        title = childNode.InnerText;
                    }

上面代码中的几行。像这样的IF语句有很多。

我的应用程序占用大量 CPU.C#.

如果您的应用程序旨在一直处理,那么它当然会消耗所有 CPU。如果它打算等待新数据到达,那么它不应该消耗太多 CPU。

人们犯的一个非常普遍的错误是编写一个繁忙的循环。那看起来像这样:

while (true)
    if (thereIsNewData())
        processNewData();

我将疯狂猜测您的代码看起来像这样。这将以完全 CPU 利用率运行,并且几乎花费所有时间重复调用几乎总是返回false thereIsNewData()

相反,您需要做的是让 CPU 在没有数据时空闲。然后醒来处理它。有无数种方法可以实现这一点。在理想情况下,当有新数据时,您会收到通知。但是,如果您无法做到这一点,那么在睡眠状态下轮询将限制 CPU 的使用。

由于我们对应用程序的体系结构一无所知,因此我什至不会尝试建议实现。但关键是你使用阻塞等待,而不是繁忙循环。

如果它总是在同一模型上,您可以分配给字典

dico[childNode.Name] = childNode.InnerText;

或者干脆把所有东西都放在一个大的开关盒里。

switch(childNode.Name)
{
  case "update_status": update_status = childNode.InnerText; break;
  case "title": title = childNode.InnerText; break;
  default: ...
}

在您的代码中,您系统地执行每个if测试,如果有很多块,将剩余的if放入else块中会略微提高性能。

开关盒肯定会使用字典进行优化。看http://www.dotnetperls.com/string-switch

无论如何,即使有数百个if。这段代码让你的客户抱怨,这听起来令人惊讶。您能告诉我们您如何处理实时URL的监控吗?