我的应用程序占用大量 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。如果它打算等待新数据到达,那么它不应该消耗太多 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的监控吗?