1. 程式人生 > >【C#】54. .Net中的併發集合——ConcurrentDictionary

【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++CC++ const常量 - 修改時報錯

#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &

LeetCode215. 陣列的第K個最大元素 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/submissions/ 題目描述: 在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不

C#xUnitMoq.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