【问题标题】:My Application is CPU intensive. C#我的应用程序是 CPU 密集型的。 C#
【发布时间】:2012-12-23 15:18:24
【问题描述】:

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

【问题讨论】:

  • 请多展示你的代码,那个小sn-ps对我们没有任何帮助。
  • 与其猜测,不如直接使用分析器看看时间在哪里使用? jetbrains.com/profiler(10 天免费试用)
  • 您是否检查过 CPU 密集型部分(使用跟踪和秒表或分析器)?
  • 您确定 CPU 时间用于解析 XML 吗?根据您提供的代码,我猜 CPU 时间在不同的地方泄漏了
  • 您可以在此处查看代码:ecsbugtracker.com/demo1/feeds.txt 像 ADDCOUNTRY 这样被调用的函数是数据层函数,用于将数据添加到数据库中。

标签: c# memory cpu


【解决方案1】:

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

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

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

我会大胆猜测您的代码看起来像这样。这将在 CPU 利用率最高的情况下运行,并且几乎所有时间都在重复调用 thereIsNewData(),而这几乎总是会返回 false

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

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

【讨论】:

  • 我相信OP的问题大概是这样的
【解决方案2】:

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

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

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

【讨论】:

  • 没有对 URL 的监控。它是一种一次性读取方法,只加载一次 XML。之后代码处理 XML。
  • @user1925139 好的,你真的能观察到“密集”的 CPU 使用率吗?也许它只是在你的客户的头脑中:)
  • 他说应用程序 UPS 使用率很高。就我而言,如果我运行它,它将占用大量内存,例如 1.40 GB 常量内存..
  • UPS 是什么? xml文件很大吗?
  • 对不起,它的 CPU 不是 UPS。是的,XML 文件可能是 10MB,有时可能是 100MB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多