我的应用程序是CPU密集型的C#

时间:2012-12-23 15:18:24

标签: c# memory cpu

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

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

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

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

                    if (childNode.Name == "title")
                    {
                        title = childNode.InnerText;
                    }

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

2 个答案:

答案 0 :(得分:3)

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

人们犯下的一个令人难以置信的错误就是写一个忙碌的循环。这看起来像这样:

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

我会猜测你的代码是这样的。这将以完全CPU利用率运行,几乎所有时间都会反复调用thereIsNewData(),这几乎总是会返回false

您需要做的是在没有数据时让CPU空闲。然后醒来处理它。有无数种方法可以实现这一目标。在理想的世界中,当有新数据时,您会收到通知。但是如果你无法管理,那么使用sleep进行轮询会限制CPU的使用。

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

答案 1 :(得分: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块会稍微改善性能,如果有很多。

切换案例肯定会使用字典进行优化。看到 http://www.dotnetperls.com/string-switch

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