我對 C# 相當陌生。我想使用并行性將兩個字典“添加”在一起。
例子:
Dictionary<string, int> dict1 = new()
{
{ "a", 1 },
{ "b", 2 },
{ "c", 3 },
//...
};
Dictionary<string, int> dict2 = new()
{
{ "a", 1 },
{ "b", 2 },
{ "c", 3 },
//...
};
結果dict1 dict2:
Dictionary<string, int> dict3 = new()
{
{ "a", 2 },
{ "b", 4 },
{ "c", 6 },
//...
};
我目前有一個解決方案,Dictionary<string, int>在我的Modifier班級中包裝 a:
public class Modifier
{
public Dictionary<string, int> modifier = new Dictionary<string, int>();
public void Add(string key, int value){
modifier.Add(key, value);
}
public bool ContainsKey(string key){
return modifier.ContainsKey(key);
}
public int this[string key]{
get => modifier[key];
set => modifier[key] = value;
}
public static Modifier operator (Modifier a, Modifier b){
foreach (string key in b.modifier.Keys){
if (a.ContainsKey(key)){
a[key] = b[key];
} else {
a.Add(key, b[key]);
}
}
return a;
}
}
補充一下,我做Modifier result = a b(在哪里a和b是Modifier物件)。但是,對于我的應用程式,我將在大型詞典中進行許多此類“添加”,并且恐怕它無法很好地擴展。
我對 C# 并行編程不是很熟悉。我考慮過將密鑰分成相等的子組并在每個組中執行一個加法,但我不太確定如何實作它,或者即使它是最優的。
進行此添加的最有效方法是什么?
uj5u.com熱心網友回復:
在這種情況下,并行性不太可能產生令人印象深刻的性能改進。實際上,除了難以實施且容易出錯之外,它更有可能使您的操作員變得更慢而不是更快。我的建議是專注于優化運算子的單執行緒性能。這是一個建議:
public static Modifier operator (Modifier a, Modifier b)
{
foreach ((string key, int value) in b.modifier)
{
ref int valueRef = ref CollectionsMarshal
.GetValueRefOrAddDefault(a.modifier, key, out bool exists);
valueRef = exists ? valueRef value : value;
}
return a;
}
在回圈的每次迭代中只執行一個字串散列foreach。僅此一項可能會給您帶來 100% 或更多的性能提升。您可以在檔案中閱讀有關該CollectionsMarshal.GetValueRefOrAddDefault方法的資訊(可從 .NET 6 及更高版本獲得)。請注意,這是一種低級方法。
IEqualityComparer<string>如果您對將用作鍵的實際字串的內部模式有特定的了解,則可以通過使用專門的 初始化字典來進一步提高性能。您可能會在 GitHub 上發現一個有趣的相關 API 提案:提供優化的只讀集合。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/531155.html
標籤:C#多线程表现并行处理
上一篇:如何檢查互斥鎖是否已被破壞?
