我有一个应用程序循环从实时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语句。
答案 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。令人惊讶的是,这段代码让你的客户抱怨。您能告诉我们您如何处理对您的实时网址的监控吗?