問題タブ [concurrent-collections]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 同時収集の更新
私は、外部フィードからデータをロードして内部コレクションに保存するマルチスレッド アプリケーションに取り組んでいます。これらのコレクションは、外部フィードからすべてのデータを再度ロードすることにより、X 分ごとに 1 回更新されます。これらのコレクションからの追加/削除は他になく、読み取るだけです。
通常、コレクションにアクセスしているすべての場所と同じように、更新中にロックを使用します。
質問:
この場合、並行コレクションは私の人生を楽にしてくれますか? 基本的に私は2つのアプローチを見ます
外部フィードからデータをロードし、もう存在しないアイテムを削除し、不足しているアイテムを追加し、変更されたアイテムを更新します。これは、同時収集の助けを借りて良い解決策だと思います (ロックは必要ありませんよね?)。私の側からのコードが多すぎます。
古いコレクション オブジェクトを新しいオブジェクトでオーバーライドするだけです (例: _data = new ConcurentBag(newData)。ここで、同時コレクションを使用してもまったく利点がないことは確かです。そうですか? ロック メカニズムが必要です。
並行コレクションを使用して、すぐに使用できるソリューションはありますか? 車輪の再発明は二度としたくありません。
c# - C# - ConcurrentBag と List のパフォーマンス比較
序文: 信頼できる方法でテストするための環境 (十分な大きさのデータセット + コンピューティング パワー) がないため、これを尋ねているだけです。
質問:何十億ものアイテムがロードされ、単一のスレッドによってアクセス/使用されるConcurrent Bagが与えられた場合、それはListと同様に機能しますか? 別の言い方をすれば、 に対する列挙は、Concurrent Bag
に対するよりも多かれ少なかれパフォーマンス的List<T>
ですか?
c# - ConcurrentQueue.Enqueue メソッドが値を追加しないのはなぜですか?
WPF MVVM アプリケーションで ConcurrentQueue を ViewModel クラス フィールドとして定義します。
以下は AGC_DataRecordToSave の定義です。
次に、System.Windows.Threading.DispatcherTimer tick ハンドラー (同じクラス内) で、次のことを行います。
また、_agcAbsoluteDataRecordsToSaveBuf は空のままです (カウント == 0)。したがって、 ConcurrentQueue.Enqueue メソッドは値をコレクションに追加しません。AGC_DataRecordToSave レコードオブジェクトが作成され、データが正常に入力されます。デバッガで確認しています。コレクションに値が追加されないのはなぜですか? なぜこのような状況になったのですか?この問題を解決するのを手伝ってください。
c# - C# で ConcurrentDictionary.Count のパフォーマンスを向上させる方法
最近、 と のどちらを使用するかを選択する必要がSortedDictionary
ありSortedList
、 に落ち着きましたSortedList
。
ただし、SortedList.Count を実行すると、C# プログラムの速度が低下することがわかりました。これは、何千回も呼び出された関数/メソッドを使用して確認しています。
通常、私のプログラムは 35 ミリ秒以内に関数を 10,000 回呼び出しますが、 を使用している間SortedList.Count
は 300 ~ 400 ミリ秒に遅くなり、基本的には 10 倍遅くなりました。
も試しSortedList.Keys.Count
ましたが、これによりパフォーマンスがさらに 10 倍低下し、3000 ミリ秒を超えました。
I have only ~5000 keys/objects in SortedList<DateTime, object_name>
. ソートされたリストから簡単かつ瞬時にデータを取得できるSortedList[date] (in 35 ms)
ので、リスト構造や保持しているオブジェクトに問題はありません。
この性能は正常ですか?
リスト内のレコード数を取得するため、またはリストにデータが入力されていることを確認するために、他に何が使用できますか? (別の追跡フラグを追加する以外に、今のところそうするかもしれません)
訂正: 申し訳ありませんが、私は実際に使用して
ConcurrentDictionary<string, SortedList<DateTime, string>> dict_list = new ConcurrentDictionary<string, SortedList<DateTime, string>>();
います: そして、さまざまな場所でさまざまなカウントがあり、リスト内のアイテムをチェックしたり、ConcurrentDicitonary でアイテムをチェックしたりしました。したがって、問題は ConcurrentDicitonary に適用され、これを確認するための簡単なテスト コードを作成しました。これには、同時実行性を使用せずに 350 ミリ秒かかります。これは ConcurrentDicitonary を使用したテストで、350 ミリ秒を示しています。