我得到了一个让我困惑的简单问题。我有2个处理器,这两个处理器可以在33.0360723中单独完成10亿次操作。 然而他们两人一起在27.4996964进行了操作。
这对我来说没有意义,如果一个处理器的任务的时间是X,那么它们两个一起不应该是X / 2吗?
我的代码:
Function calc(ByVal i As Integer, ByVal result As String)
Math.Sqrt(i)
Return True
End Function
Sub Main()
Dim result As String = Nothing
Dim starttime As TimeSpan
starttime = DateTime.Now.TimeOfDay
For i = 0 To 1000000000
calc(i, result)
Next
Console.WriteLine("A single processor runs 1 billion operations in: ")
Console.WriteLine(DateTime.Now.TimeOfDay - starttime)
starttime = DateTime.Now.TimeOfDay
Parallel.For(0, 1000000000, Function(i) calc(i, result))
Console.WriteLine("All your processors run 1 billion operations in: ")
Console.WriteLine(DateTime.Now.TimeOfDay - starttime)
Console.ReadLine()
End Sub
PS:我在VB.net中为此做了代码。
答案 0 :(得分:1)
如果一个人可以在30分钟内步行2英里,那么2个人走2英里需要多长时间?
除了所有的笑话,MSDN上的文档说:执行for(For in Visual Basic)循环,其中迭代 MAY 并行运行。这里的关键字是 MAY 。
你让CLR做的工作和经验说明.net CLR并不总是像你想象的那样工作。
在我的情况下(复制粘贴代码)单处理器 - 21.495秒,所有处理器:7.03秒。我在32位Windows 7上安装了i7 870 CPU。
答案 1 :(得分:0)
在Parallel.For
中,迭代的顺序不一定与循环的顺序相同。
您的功能也是sqrt(i)
,这意味着一个处理器可能正在执行sqrt(smallernumbers)
而另一个sqrt(largernumbers)
。
简单的回答是每个处理器完成的工作并不完全是你给他们的整个工作的一半,所以他们不太可能是平等的。
一个处理器可能已完成更多工作,而其他处理器可能已完成其工作并等待另一个处理器。或者其中一个处理器可能由操作系统preempted
执行一些重要操作,而您的工作线程可能一直在等待。