-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 ケースは、辞書を使用して確実に最適化されます。http://www.dotnetperls.com/string-switchを参照して ください

とにかく何百ものifがあっても。このコードがクライアントに不満を抱かせるのは驚くべきことです。ライブ URL の監視をどのように処理しているか教えていただけますか?

于 2012-12-23T15:34:22.610 に答える