C# 并行操作批处理
TPL(任务并行库)中是否内置了批处理操作支持 我最近正在玩一个例程,使用查找表(即音译)对字符数组执行字符替换:C# 并行操作批处理,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,TPL(任务并行库)中是否内置了批处理操作支持 我最近正在玩一个例程,使用查找表(即音译)对字符数组执行字符替换: for (int i = 0; i < chars.Length; i++) { char replaceChar; if (lookup.TryGetValue(chars[i], out replaceChar)) { chars[i] = replaceChar; } } 然后,我重新修改了算法,使用批处理,这样工作就
for (int i = 0; i < 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;
}
}
});
为了更好地让你的头脑清醒,你应该去看医生。这是一个很好的来源,并解释了如何使用第三方物流的常见方法 请看第26页(非常小的环体)。在这里,您可以找到以下示例:
Parallel.ForEach(Partitioner.Create(from, to), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
// ... process i
}
});
Parallel.ForEach(Partitioner.Create(from,to),range=>
{
对于(int i=range.Item1;i
因此,您正在搜索的缺失部分是。谢谢您的链接,但是您对我的问题有具体的答案吗?非常感谢。工作完美,也是一个非常好的API:)我根据你的答案用一个例子更新了我的问题。
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;
}
}
});
Parallel.ForEach(Partitioner.Create(from, to), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
// ... process i
}
});