簡體   English   中英

並行操作批處理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM