gpt4 book ai didi

c# - 总结为双倍时从 ForEach 循环转换为 Parallel.ForEach 循环会减慢速度

转载 作者:行者123 更新时间:2023-12-03 18:59:31 25 4
gpt4 key购买 nike

我有一段 C# 代码如下。此代码总结了 DataTable 中的一列“ double ”:

var data = this.Db.ExecuteRead(query, this.Score.Name);
var time = 0.0;
foreach (DataRow row in data.Rows)
{
time += this.ParseDouble(row[0].ToString()) / MillisecondsPerMinute;
}
执行此代码需要 4 秒。我想加快速度,所以我将它并行化如下:
Parallel.ForEach(
data.AsEnumerable(),
row =>
{
time += this.ParseDouble(row[0].ToString()) / MillisecondsPerMinute;
});
此代码需要 3 秒才能执行。它也会导致碰撞。我不认为“双”线程安全。这是预料之中的。然后我添加了一个互斥体以使其线程安全:
Parallel.ForEach(
data.AsEnumerable(),
row =>
{
mut.WaitOne();
ptime += this.ParseDouble(row[0].ToString()) / MillisecondsPerMinute;
mut.ReleaseMutex();
});
这段代码要慢得多。执行需要 15 秒,但会产生准确的结果。我的问题是,我最好在这里使用标准的“ForEach”,还是可以以更好的方式实现多线程?
作为引用,这里是 ParseDouble 方法:
protected double ParseDouble(string text)
{
double value;
if (!double.TryParse(text, out value))
{
throw new DoubleExpectedException();
}

return value;
}

最佳答案

这里有一些方法。先来个简单的Parallel.ForEach ,将 protected 区域 ( lock ) 减少到所需的绝对最小值(更新共享状态)。这应该最大限度地减少对锁的争用。

DataTable data = this.Db.ExecuteRead(query, this.Score.Name);
double totalTime = 0.0;
Parallel.ForEach(data.AsEnumerable(), row =>
{
double time = Double.Parse(row[0].ToString()) / MillisecondsPerMinute;
lock (data) { totalTime += time; }
});
PLINQ方法。简单安全,但可能不是最有效的:
double totalTime = data
.AsEnumerable()
.AsParallel()
.Select(row => Double.Parse(row[0].ToString()) / MillisecondsPerMinute)
.Sum();
Parallel.ForEach的组合和 Partitioner.Create 应该提供最佳性能,因为它允许对工作负载进行分块:
double totalTime = 0.0;
Parallel.ForEach(Partitioner.Create(0, data.Rows.Count), () => 0.0D,
(range, state, accumulator) =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
DataRow row = data.Rows[i];
accumulator += Double.Parse(row[0].ToString()) / MillisecondsPerMinute;
}
return accumulator;
}, accumulator =>
{
lock (data) { totalTime += accumulator; }
});

关于c# - 总结为双倍时从 ForEach 循环转换为 Parallel.ForEach 循环会减慢速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65204040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com