【C#】54. .Net中的併發集合——ConcurrentDictionary
轉載自《C#多執行緒程式設計例項》
對於平行計算,我們需要使用適當的資料結構。這些結構具備可伸縮性,儘可能地避免鎖,並且還能提供執行緒安全的訪問。.Net Framework 引入了System.Collections.Concurrent 名稱空間,包含了一些資料結構。
const string Item = "Dictionary item";
public static string CurrentItem;
static void Main(string[] args) { var concurrentDictionary = new ConcurrentDictionary<int, string>(); var dictionary = new Dictionary<int, string>(); var sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 1000000; i++) { lock (dictionary) { dictionary[i] = Item; } } sw.Stop(); Console.WriteLine("Writing to dictionary with a lock: {0}", sw.Elapsed); sw.Restart(); for (int i = 0; i < 1000000; i++) { concurrentDictionary[i] = Item; } sw.Stop(); Console.WriteLine("Writing to a concurrent dictionary: {0}", sw.Elapsed); sw.Restart(); for (int i = 0; i < 1000000; i++) { lock (dictionary) { CurrentItem = dictionary[i]; } } sw.Stop(); Console.WriteLine("Reading from dictionary with a lock: {0}", sw.Elapsed); sw.Restart(); for (int i = 0; i < 1000000; i++) { CurrentItem = concurrentDictionary[i]; } sw.Stop(); Console.WriteLine("Reading from a concurrent dictionary: {0}", sw.Elapsed); Console.Read(); }
可以明顯地看出使用lock配合Dictionary 與 ConcurrentDictionary 的效能差異:在“寫”操作上,lock配合Dictionary顯然快很多;而在“讀”操作上,ConcurrentDictionary更快一些。但是請注意,這裡使用的是單執行緒!如果執行緒數量上去,ConcurrentDictionary的效率會大大提升。
相關推薦
【C#】54. .Net中的併發集合——ConcurrentDictionary
轉載自《C#多執行緒程式設計例項》 對於平行計算,我們需要使用適當的資料結構。這些結構具備可伸縮性,儘可能地避免鎖,並且還能提供執行緒安全的訪問。.Net Framework 引入了System.Collections.Concurrent 名稱空間,包含了一些資料結構。
【C++】 刪除vector中重複元素
程式碼: vector<int> v={1,2,4,3,5.2}; sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); 解釋: unique函式是一個去重函式,去
【C#】判斷字串中是否包含指定字串,contains與indexof方法效率問題
1 class Program 2 { 3 private const int N = 10000000; 4 private static Stopwatch watch = new Stopwatch(); 5 static v
【c++】為什麼類中靜態(static)成員不能在類的定義內初始化?
先看一段程式碼: #include <iostream> using std::cout; //class class loopsaker { public: static int a=1; // 錯誤! loopsaker(); }; int ma
【C#】遍歷各類資料集合的方法
1、列舉型別 //遍歷列舉型別Sample的各個列舉名稱 foreach (string sp in Enum.GetNames(typeof(Sample)))
【C++】找陣列中唯一出現兩次的數
題:假設你有一個用1001個整陣列成的陣列,這些整數是任意排列的,但是你知道所有的整數都在1到1000(包括1000)之間。此外,除一個數字出現兩次外,其他所有數字只出現一次。假設你只能對這個陣列
【C++】在繼承中虛擬函式、純虛擬函式、普通函式,三者的區別
1.虛擬函式(impure virtual) C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。 子類可以重寫父類的虛擬函式實現子類的特殊化。 如下就是一個父類中的虛擬函式: class A { public: virt
【C++】String類中的運算子過載
模組化設計: 標頭檔案: <span style="font-size:18px;">#ifndef operator_operator_h #define operator_op
【C#】淺析C#中的日期處理
see var time tostring 靈活性 ide format tin 介紹 1.字符串轉化為日期 1.1第一種方式 使用 Convert.toDateTime 方法,該方法有很多重載方法,這裏筆者就介紹兩個常用的重載方法。 第一種: 使用: Con
【C++】判斷元素是否在vector中,對vector去重,兩個vector求交集、並集
bool iostream space col 求交集 uniq AI void print #include <iostream> #include <vector> #include <algorithm> //sort函數、交並補
【c++】c++中重載輸出操作符,為什麽要返回引用
不返回 定義 類型 AS 標準 操作符 連續 新的 輸出 針對:ostream & operator <<(ostream & os, const ClassType &object) 說明幾點: 1.第一個形參為對ostream對象的引
【轉】在.net Core 中像以前那樣的使用HttpContext.Current
single .get soft ESS contex vid pro del 文件中 1.首先我們要創建一個靜態類 public static class MyHttpContext { public static IServic
【C++】C與C++中 const常量 - 修改時報錯
#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &
【LeetCode】215. 陣列中的第K個最大元素 結題報告 (C++)
原題地址:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/submissions/ 題目描述: 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不
【C#】【xUnit】【Moq】.NET單元測試Mock框架Moq初探!
在TDD開發模型中,經常是在編碼的同時進行單元測試的編寫,由於現代軟體開發不可能是一個人完成的工作,所以在定義好介面的時候我們就可以進行自己功能的開發(介面不能經常變更),而我們呼叫他人的功能時只需要使用介面即可。 但我們在編寫自己的單元測試並進行功能驗證的時候,如果介面的實現人還沒有完成程式碼怎麼
【C++】c++中的六個預設函式——解構函式
解構函式(不能過載,沒有引數,一個類只能有一個解構函式。如果沒定義,編譯器會自動生成一個) 解構函式:建立物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷燬物件時系統也會自動呼叫一個函式來進行清理工作。 解構函式(Destructor)也是一種特殊的成員函式,沒有返回值,不需要
【C++】c++中的六個預設函式——建構函式
類的6個預設的成員函式包括: 建構函式、解構函式、拷貝建構函式、賦值運算子過載函式、取地址操作符過載、const修飾的取地址操作符過載。(但是重點講前四個) 建構函式(可以過載) 在C++中,有一種特殊的成員函式,它的名字和類名相同,沒有返回值,不需要使用者顯
【C++】類中靜態成員的宣告、初始化
【C++】類中靜態成員的宣告、初始化 類中靜態成員的宣告 初始化 靜態資料成員值的改變 完整例子 有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/784
【C#】之 集合
#一、ArrayList 對於普通的陣列,在宣告時需指定其型別,每一種陣列只能對應一種型別,並且陣列順序需按小到大排序。如果想要隨便的在任意一個數組中放各種型別的資料,並且不確定放多少個,這時就用到了ArrayList集合——動態陣列。 ##1、宣告方法 Array List 陣
【C++】併發-1 執行緒管理-1
【建立】 有四種方式: 預設 傳入執行函式 定義一個類, 過載 operator() ,執行緒執行過程 lambda // std::thread 簡單使用 namespace T1 { template<class T> class Thread