我在我的 PC 上运行了一些相当消耗处理器的东西,并注意到我的 CPU 使用率看起来很奇怪。我的电脑是四核 i7-870,据说有八个虚拟内核。
我在 .NET 4 中使用 Task Parallel 库,所以希望所有内核都能得到很好的利用,但我从 Process Monitor 获得了这样的信息:
核心 6 和 8 几乎没有被触及,除了短暂的爆发之外,4 也没有。
这是我应该期待的吗?
我在我的 PC 上运行了一些相当消耗处理器的东西,并注意到我的 CPU 使用率看起来很奇怪。我的电脑是四核 i7-870,据说有八个虚拟内核。
我在 .NET 4 中使用 Task Parallel 库,所以希望所有内核都能得到很好的利用,但我从 Process Monitor 获得了这样的信息:
核心 6 和 8 几乎没有被触及,除了短暂的爆发之外,4 也没有。
这是我应该期待的吗?
在大多数情况下,是的,我认为这看起来很合理。请记住,超线程实际上只是伪造了两个内核。每个物理内核都有两个前端,因此它可以并行读取两个指令流。但它们仍然共享相同的执行单元。因此,当一个 HT 核心忙时,执行单元就会被占用,因此它的“双胞胎”核心将能够做很少的工作。
这似乎是您在前两个内核上看到的(尤其是第二个内核非常明显)
除此之外,您几乎永远无法获得完美的 CPU 利用率。有时,核心只需要停止等待内存。有时它正在执行昂贵的非流水线指令,从而有效地阻塞物理内核上的执行单元可能数十甚至数百个周期。
有时,指令之间的依赖关系可能只是意味着您没有任何东西可供一个或多个内核执行。
除此之外,您会看到 8 个图表,而您只有 4 个内核,所以是的,当然超线程正在工作。;)
简而言之
List<>
也将在内部使用 Array 并针对结构元素类型进行优化)0.02 美元
这完全取决于您的算法实现。TPL 将根据算法中的数据依赖性使用适当数量的内核