【发布时间】:2012-01-11 14:35:08
【问题描述】:
*请注意,我只是在测试以了解这一点。
我正在尝试通过Parallel.For() 方法使用我计算机的所有内核。这工作得很好,但是当我尝试使用普通 for 循环的相同方法时,它的速度要快得多。并行方法耗时 16 秒,普通方法仅需 6 秒。
我希望你能告诉我我在这里做错了什么。
更新代码
DateTime parallelStart = new DateTime();
DateTime parallelFinish = new DateTime();
DateTime singeStart = new DateTime();
DateTime singeFinish = new DateTime();
parallelStart = DateTime.Now;
int inputData = 0;
Parallel.For(0, 1000000000, i =>
{
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
});
parallelFinish = DateTime.Now;
singeStart = DateTime.Now;
for (int i = 0; i < 1000000000; i++)
{
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
inputData = inputData++;
}
singeFinish = DateTime.Now;
MessageBox.Show("Parallel execution time: " + (parallelFinish - parallelStart).Seconds + "\n" +
"Singe execution time: " + (singeFinish - singeStart).Seconds);
第一个代码:
DateTime parallelStart = new DateTime();
DateTime parallelFinish = new DateTime();
DateTime singeStart = new DateTime();
DateTime singeFinish = new DateTime();
parallelStart = DateTime.Now;
Parallel.For(0, 2000000000, i =>
{
var inputData = 0;
});
parallelFinish = DateTime.Now;
singeStart = DateTime.Now;
for (int i = 0; i < 2000000000; i++)
{
var inputData = 0;
}
singeFinish = DateTime.Now;
MessageBox.Show("Parallel execution time: " + (parallelFinish - parallelStart).Seconds + "\n" + "Singe execution time: " + (singeFinish - singeStart).Seconds);
【问题讨论】:
-
我会假设某种优化可能会删除你的循环,因为它没有做任何事情。这不是 DateTime.Now 的正确使用。只是有很多错误。
-
我试图添加一些工作,现在它需要相同的大部头......所以你没事(ofcurse)。它只需要一些东西来工作:)
-
乔是对的;使用秒表进行性能分析。 DateTime.Now 没有足够好的精度。
-
你不应该做的问题与你的性能问题没有直接关系。
inputData = inputData++;不应该这样做,因为++已经更新了淡水河谷。此外(也是更重要的问题),由于所有线程在没有任何同步的情况下读取和写入同一个变量,您可能会弄乱变量的值。