Multicore 在双核处理器上,如果另一个程序同时运行,程序运行得更快!

Multicore 在双核处理器上,如果另一个程序同时运行,程序运行得更快!,multicore,Multicore,这是在双核Athlon II上,带有Windows XP和Java 1.6.0_07。我有一个基准测试程序,它使用多个线程进行计算,运行时间为10秒 作为演示,我有另一个程序,它不使用线程进行相同的计算;使用一个调用Math.cos的方法的循环非常简单。运行时,java.exe使用50%的CPU,系统空闲进程使用50%;正如我所料。但这并不像我预期的那样需要20秒,而是需要30秒左右。任务管理器显示每个核心的使用率约为50% 如果我打开两个命令提示符窗口,在每个窗口中运行第二个程序,那么两个进程

这是在双核Athlon II上,带有Windows XP和Java 1.6.0_07。我有一个基准测试程序,它使用多个线程进行计算,运行时间为10秒

作为演示,我有另一个程序,它不使用线程进行相同的计算;使用一个调用Math.cos的方法的循环非常简单。运行时,java.exe使用50%的CPU,系统空闲进程使用50%;正如我所料。但这并不像我预期的那样需要20秒,而是需要30秒左右。任务管理器显示每个核心的使用率约为50%

如果我打开两个命令提示符窗口,在每个窗口中运行第二个程序,那么两个进程同时运行,只需大约19秒。每个核心的使用率为100%

似乎只有一个程序在运行时,调度器无法决定使用哪个内核,三分之一的时间浪费在上下文切换上

我的问题是:我应该期待这种情况发生,还是这表明某种配置错误

更新

的确,实验可以揭示奇怪的结果。这里的回复和链接文章非常有用,因为我关注的是细节,而不是大局


自从提出这个问题以来,我发现这种特殊情况与电源管理软件有关,该软件在处理器未完全加载时会降低时钟速度。这将惩罚不使用多线程的程序。

Joshua Bloch就此类基准测试的困难发表了一篇精彩的演讲。这里有一篇文章对其进行了总结,还有一个演讲的链接:


一般结论:处理器和虚拟机执行各种复杂且不可预测的优化,这些优化以违反直觉的方式影响基准测试,如您所描述的那样。在任何特定情况下,由于系统的巨大复杂性,确实无法确定是什么导致了异常。提高性能的唯一方法是对基准数据进行实验和统计分析。

你不必期望它发生,你已经说过了。真正的答案是,当你做这种类型的微基准标记时,你应该期望看到奇怪的结果。