[英]Parallel Operation Batching
在TPL(任務 - 並行 - 庫)中是否有內置支持用於批處理操作?
我最近玩了一個例程,使用查找表即音譯在字符數組上進行字符替換:
for (int i = 0; i < chars.Length; i++)
{
char replaceChar;
if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
}
我可以看到,這可能是平凡的並行化,所以跳入第一次刺,我知道會因為任務太細粒度而表現更差:
Parallel.For(0, chars.Length, i =>
{
char replaceChar;
if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
});
然后我重新編寫算法以使用批處理,這樣就可以將工作分成不同細粒度的不同線程。 這使得線程按預期使用,並且我得到了一些接近線性的加速。
我確信必須內置支持TPL中的批處理。 什么是語法,我該如何使用它?
const int CharBatch = 100;
int charLen = chars.Length;
Parallel.For(0, ((charLen / CharBatch) + 1), i =>
{
int batchUpper = ((i + 1) * CharBatch);
for (int j = i * CharBatch; j < batchUpper && j < charLen; j++)
{
char replaceChar;
if (lookup.TryGetValue(chars[j], out replaceChar))
{
chars[j] = replaceChar;
}
}
});
更新
在使用@Oliver的答案並用Parallel.ForEach和Partitioner替換Parallel.For
,代碼如下:
const int CharBatch = 100;
Parallel.ForEach(Partitioner.Create(0, chars.Length, CharBatch), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
char replaceChar;
if (lookup.TryGetValue(chars[i], out replaceChar))
{
chars[i] = replaceChar;
}
}
});
為了更好地了解您的應用,您應該獲得並行編程模式:使用.NET Framework理解和應用並行模式4 。 它是一個很好的資源,並解釋了如何使用TPL的常用方法。
看看第26頁(非常小的循環體)。 在那里你會發現這個例子:
Parallel.ForEach(Partitioner.Create(from, to), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
// ... process i
}
});
因此,您正在搜索的缺失部分是System.Concurrent.Collections.Partitioner
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.