我正在玩配备超线程CPU的Azure VM。假设F2_v2大小的VM具有带有超线程的单核,因此声称在那里使用了两个“虚拟”CPU( 2.7 GHz IntelXeon®Platinum8168(SkyLake))。我使用代码from this answer来制作CPU密集型负载。
static void doWork()
{
var start = DateTime.UtcNow;
var value = FindPrimeNumber(1024 * 1024);
var end = DateTime.UtcNow;
Console.WriteLine(String.Format("Value {0} found in {1} seconds",
value, (end-start).TotalSeconds));
}
首先,我只是从Main()
内部调用该函数:
static void Main(string[] args)
{
doWork();
}
报告的时间约为32秒。然后我从该可执行文件中运行两个进程(使用两个控制台并且速度很快) - 然后每个进程都会减慢并且报告的时间大约为64秒 - 正如预期的那样,因为有一个真正的CPU并且它不能并行运行两个进程。
然后我尝试使用Parallel.Invoke()
并行运行两个线程:
static void Main(string[] args)
{
Parallel.Invoke(() => doWork(), () => doWork());
}
(是的,两个线程同时获取时间并同时写入控制台但我希望这不会对结果造成太大影响)并且报告的时间变为大约60秒 - 比两个进程稍快一些。此测试使用Windows命令提示符完成,而不是通过在调试器下调用。
我期望通过超线程我可以同时运行两个线程并且同时完成两倍的计算工作 - 接近95%的加速。看起来并非如此。
我做错了什么?我该怎么办呢?