这是一款采用Windows XP和Java 1.6.0_07的双核Athlon II。我有一个使用多个线程进行计算的基准程序,运行时间为10秒。
对于演示,我有另一个程序在不使用线程的情况下进行相同的计算;循环调用一个调用Math.cos()的方法非常简单。当这个运行时,java.exe使用50%的CPU,System Idle Process使用50%;正如我所料。但不是像我预期的那样花费大约20秒,而是需要大约30秒。任务管理器显示每个核心的使用率约为50%。
如果我打开两个命令提示符窗口,并在每个窗口中运行第二个程序,则两个进程同时运行,只需要大约19秒。每个核心的使用率为100%。
似乎当只有一个程序在运行时,调度程序无法决定使用哪个核心,并且三分之一的时间浪费在上下文切换上。
我的问题是:我是否应该发生这种情况,或者这是否表明存在某种错误配置?
更新
确实,实验可以揭示出奇怪的结果。这里的回复(和链接的文章)非常有用,因为我一直专注于细节,而不是更大的图景。
自提出这个问题以来,我发现这个特殊情况与电源管理软件有关,当处理器没有满载时会降低时钟速度。这会惩罚不使用多线程的程序。
答案 0 :(得分:0)
Joshua Bloch谈到了这种基准测试的困难。这是一篇总结它的文章(那里也有一个关于这个话题的链接): http://java.dzone.com/articles/joshua-bloch-performance
一般结论:处理器和虚拟机执行各种复杂且不可预测的优化,这些优化会以违反直觉的方式影响基准测试,例如您所描述的那些。在任何特定情况下,由于系统的巨大复杂性,实际上无法确定导致异常的原因。提高绩效的唯一方法是使用基准数据的实验和统计分析。