並行キューでのパフォーマンスの低下

トム

私は2つのスレッドを持っています。1つは、シリアルポートからデータを収集し、それを配列に配置して、並行キューに追加することです。もう1つのスレッドは、これらの配列を取得して、データをリアルタイムでプロットしています。毎秒50バイトのデータの約150パケットがあります。私が抱えている問題は、これを実行すると、約10%のCPUを消費していることです。そして、これは非常に高速なコアI7Haswell上にあります。消費スレッドにThread.Sleep(1)を追加すると、CPU使用率が1%に低下します。問題は、これをThread.Sleep(2)に置くと、パケットが同期されなくなることです。したがって、これは解決策ではなく、低速のコンピューターで実行した場合、おそらく機能しません。

コードは単純です。これがプロデューサースレッドです:

    static void FillQueue(byte[] buffer)
    {
        dataQueue.Enqueue(buffer);
    }

そしてここに消費者スレッドがあります:

        while (continuePolling)
        {                
            Thread.Sleep(1); //if removed, there is 10% CPU utilization.  If higher then packet synchronization is lost.

            if (dataQueue.TryDequeue(out result))
            {
                ProcessPacket(result);
            }               
        }

ProcessPacketメソッドの実行には約0.3ミリ秒かかり、1秒間に約10回呼び出されるため、これを理解するのは難しいと思います。

代わりにブロッキングコレクションを使用してみました。こちらがプロデューサーです

 BlockingCollection<byte[]> dataQueue = new BlockingCollection<byte[]>;

 public static void addData(buffer)
 {
      dataQueue.add(buffer);
 }

そしてここに消費者がいます

 while (dataQueue.TryTake(out result)
 {
     ProcessPacket(result);
 }

全く違いはありません!10%のCPUを使用し、Thread.Sleep(1)を追加すれば問題ありませんが、Thread.Sleep(2)とパケットを失うと、取得できません。各パケットには50バイトがあります。それでおしまい。そして、それらは生産されるのと同じくらい速く消費されます。ありがとう

Evk

それはあなたが本質的にwhile (true) {}ループを持っているからですProcessPacket0.3msかかり、1秒あたり10パケットあるので、1秒あたり3msの有用な作業があります。残りの997msは、ループがキューに新しいアイテムがあるかどうかを常にチェックし、CPUリソースを浪費します。

代わりに、BlockingCollectionキューと一緒に使用してください。キューには、タスクにはるかに優れたオプションがあります。デキューのブロック(必要に応じてタイムアウトとキャンセルトークンを使用)をサポートしているため、CPUを浪費しません。

var dataQueue = new BlockingCollection<string>(new ConcurrentQueue<string>());
// Add instead of Enqueue
dataQueue.Add("some item");
// Take instead of Dequeue, this will block until item is available in queue
var result = dataQueue.Take();
// blocks until item is available or timeout happens
if (dataQueue.TryTake(out result, TimeSpan.FromMilliseconds(100)))

また、「ストリーミング」インターフェースもサポートしているため、コードは次のようになります。

foreach (var result in dataQueue.GetConsumingEnumerable()) {
    ProcessPacket(result);        
}

そして、continuePollingフラグの代わりに-

dataQueue.CompleteAdding();

これ以上アイテムが期待されない場合(つまり、continuePollingfalseに設定する場合)-これGetConsumingEnumerableにより、アイテムの提供が終了し、返品されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

行レベルのセキュリティ、パフォーマンスの低下

分類Dev

並列ループパフォーマンスの低下

分類Dev

BCryptのパフォーマンス低下

分類Dev

並行してパフォーマンスが低下する

分類Dev

CythonでのC ++関数のパフォーマンスの低下

分類Dev

Win10でのVirtualBoxのパフォーマンスの低下

分類Dev

MySQLでのUNIONALLのパフォーマンスの低下

分類Dev

SQLiteバキューム/フラグメンテーションとパフォーマンスの低下

分類Dev

Windowsで実行するとCUDAのパフォーマンスが低下する

分類Dev

Linuxでのmemcpyパフォーマンスの低下

分類Dev

Java演習でのパフォーマンスの低下

分類Dev

Keras:ImageDataGeneratorでのパフォーマンスの低下

分類Dev

左結合でのCTEのパフォーマンス低下

分類Dev

アレイでのOpenMPのパフォーマンス低下

分類Dev

レコードの増加に伴うmongoldbドキュメント更新のパフォーマンスの低下

分類Dev

ハッシュテーブルのパフォーマンスの突然の低下

分類Dev

MySQLの結果をキャッシュするときのゲインとパフォーマンスの低下

分類Dev

AndroidでOpenCvフォーミングパフォーマンスの低下を使用したドキュメント検出

分類Dev

PostgreSQLの自動バキュームによりパフォーマンスが大幅に低下します

分類Dev

なぜ並列化はパフォーマンスを劇的に低下させるのでしょうか?

分類Dev

複数のファイルでのzgrepのパフォーマンスの低下

分類Dev

SteamゲームでのBumblebeeのパフォーマンスの低下

分類Dev

最小限のxsessionでのChromeのパフォーマンスの低下

分類Dev

50.000.000ドキュメントに加えて大規模なコレクションでのMongoDBの書き込みパフォーマンスの低下

分類Dev

Ubuntuゲームの質問-パフォーマンスの低下

分類Dev

カーソルのパフォーマンス低下の問題

分類Dev

CSS:Webkit、Chromeでのホバーパフォーマンスの低下

分類Dev

実行時間の長いメソッドでのJavaデバッグパフォーマンスの低下

分類Dev

Bob Jenkinsのハッシュがパフォーマンスを低下させる

Related 関連記事

  1. 1

    行レベルのセキュリティ、パフォーマンスの低下

  2. 2

    並列ループパフォーマンスの低下

  3. 3

    BCryptのパフォーマンス低下

  4. 4

    並行してパフォーマンスが低下する

  5. 5

    CythonでのC ++関数のパフォーマンスの低下

  6. 6

    Win10でのVirtualBoxのパフォーマンスの低下

  7. 7

    MySQLでのUNIONALLのパフォーマンスの低下

  8. 8

    SQLiteバキューム/フラグメンテーションとパフォーマンスの低下

  9. 9

    Windowsで実行するとCUDAのパフォーマンスが低下する

  10. 10

    Linuxでのmemcpyパフォーマンスの低下

  11. 11

    Java演習でのパフォーマンスの低下

  12. 12

    Keras:ImageDataGeneratorでのパフォーマンスの低下

  13. 13

    左結合でのCTEのパフォーマンス低下

  14. 14

    アレイでのOpenMPのパフォーマンス低下

  15. 15

    レコードの増加に伴うmongoldbドキュメント更新のパフォーマンスの低下

  16. 16

    ハッシュテーブルのパフォーマンスの突然の低下

  17. 17

    MySQLの結果をキャッシュするときのゲインとパフォーマンスの低下

  18. 18

    AndroidでOpenCvフォーミングパフォーマンスの低下を使用したドキュメント検出

  19. 19

    PostgreSQLの自動バキュームによりパフォーマンスが大幅に低下します

  20. 20

    なぜ並列化はパフォーマンスを劇的に低下させるのでしょうか?

  21. 21

    複数のファイルでのzgrepのパフォーマンスの低下

  22. 22

    SteamゲームでのBumblebeeのパフォーマンスの低下

  23. 23

    最小限のxsessionでのChromeのパフォーマンスの低下

  24. 24

    50.000.000ドキュメントに加えて大規模なコレクションでのMongoDBの書き込みパフォーマンスの低下

  25. 25

    Ubuntuゲームの質問-パフォーマンスの低下

  26. 26

    カーソルのパフォーマンス低下の問題

  27. 27

    CSS:Webkit、Chromeでのホバーパフォーマンスの低下

  28. 28

    実行時間の長いメソッドでのJavaデバッグパフォーマンスの低下

  29. 29

    Bob Jenkinsのハッシュがパフォーマンスを低下させる

ホットタグ

アーカイブ