【发布时间】:2010-07-28 15:30:56
【问题描述】:
令人惊讶的是,在我创建的一个小测试用例上,使用 PLINQ 并没有带来任何好处。事实上,它甚至比通常的 LINQ 还要糟糕。
这是测试代码:
int repeatedCount = 10000000;
private void button1_Click(object sender, EventArgs e)
{
var currTime = DateTime.Now;
var strList = Enumerable.Repeat(10, repeatedCount);
var result = strList.AsParallel().Sum();
var currTime2 = DateTime.Now;
textBox1.Text = (currTime2.Ticks-currTime.Ticks).ToString();
}
private void button2_Click(object sender, EventArgs e)
{
var currTime = DateTime.Now;
var strList = Enumerable.Repeat(10, repeatedCount);
var result = strList.Sum();
var currTime2 = DateTime.Now;
textBox2.Text = (currTime2.Ticks - currTime.Ticks).ToString();
}
结果?
textbox1: 3437500
textbox2: 781250
所以,LINQ 比 PLINQ 花费更少的时间来完成类似的操作!
我做错了什么?还是有我不知道的转折?
编辑:我已经更新了我的代码以使用秒表,但同样的行为仍然存在。为了降低 JIT 的影响,我实际上尝试了几次同时单击 button1 和 button2 并且没有特定的顺序。虽然我得到的时间可能不同,但定性行为仍然存在:PLINQ 在这种情况下确实比较慢。
【问题讨论】:
-
提示:使用
Stopwatch类来衡量性能。测量时间段会比DateTime.Now更准确。 -
@Anthony Pegram,怎么会这样?我可以很容易地看到每种类型将是什么。
-
你能告诉我们你在什么硬件上运行它吗?
-
@Anthony,抱歉命名不当;这只是我凭空想出的一个例子,一个简单的例子,所以我希望任何阅读它的人都能一眼就理解它。这里没有火箭科学。
-
@Anthony 肯定不是人民展览 A,因为 var 实际上不可能被滥用。如果您以有意义的方式命名变量,则无需知道类型即可理解代码。 (如果有疑问,请尝试阅读 F# 代码,它非常易读,您只能使用 var 的等效项(几乎至少))