【发布时间】:2014-07-08 13:50:42
【问题描述】:
我用大数组创建了一个简单的测试,我发现并行 for 和普通 for 之间有很大的不同
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var rn = new Random(541);
var tmStart = DateTime.Now;
int[,] a = new int[2048, 2048];
for (int i = 0; i < 2048; i++)
for (int j = 0; j < 2048; j++)
a[i, j] = rn.Next();
var tmEnd = DateTime.Now - tmStart;
Console.WriteLine("Normal..: {0}",tmEnd.ToString());
tmStart = DateTime.Now;
a = new int[2048, 2048];
Parallel.For(0, 2048, i =>
{
for (int j = 0; j < 2048; j++)
a[i, j] = rn.Next();
});
tmEnd = DateTime.Now - tmStart;
Console.WriteLine("Parallel: {0}", tmEnd.ToString());
}
}
}
办理时间:
正常..:00:00:00.1250071
并行:00:00:00.3880222
为什么差别这么大?
我想如果你使用多个线程,它会更快......
【问题讨论】:
-
尝试使用更大的数组。创建线程存在开销,因此一旦达到足够的工作负载,并行可能会更快
-
除了变慢之外,您还违反了线程规则。你需要序列化对
rn的访问。 -
这个基准有很多问题,试图挽救它真的没有什么意义......
-
至少使用
System.Diagnostics.Stopwatch作为您的计时,并确保您不要在附加调试器和发布模式下运行,还要注意x86 和x64 会产生彼此不同的计时。以非定时运行开始多次运行以预热代码,然后平均运行时间。而且,它们不是大数组。 -
@Alexandre 并行化代码并不是人们认为的灵丹妙药。要问的最简单的问题是:多只手可以做轻的工作吗?如果您可以自己更快地完成一项任务,那就别管它了。如果一项任务可以从许多人的工作中受益,再加上管理这些人的开销,那么就这样做。所有这一切的决定因素是领域知识。您将知道您的代码何时可以从中受益,例如在昂贵的表上一次执行 3 个数据库调用,无论它们的成本有多高。逐案处理。