-2

我有一个循环从实时 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 语句。

4

2 回答 2

3

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

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

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

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

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

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

于 2012-12-23T15:39:27.763 回答
0

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

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

switch case 肯定会使用字典进行优化。见 http://www.dotnetperls.com/string-switch

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

于 2012-12-23T15:34:22.610 回答