然后看到DEV是Linux 2.6的,其他环境是Linux 2.4的;这是一个较大的差异,但是具体这个2.4和2.6对我们JAVA代码的区别,一开始并不明白;后来才具体跟踪发现:
wait(5)这行代码在Linux 2.4和Linux 2.6下面会有很大的性能差异;
//当然根据分析这个情况其实是可以跳过的。。
在某一步,可能会执行到如下代码,就是在一定情况下会等待
synchronized(o)
{
try {
o.wait(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}按照JDK的说明,这行代码的意思是,如果有其他线程调用这个对象的notify()或者是notifyall()方法,那么wait(5)结束;如果没有被Notify()或者notifyall()的话,那么超时后结束,这里的话就是5ms后结束;
2. 然而实测发现,在Linux 2.4和Linux 2.6上,这段代码会产生较大的性能差异;
测试方法,运行下面的WaitTimeTest代码500次,然后用脚本统计平均时间
package com.hetaoblog.demo;
public class WaitTimeTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i = 0; i < 100; ++i)
{
long t1 = System.currentTimeMillis();
WaitTimeTest o = new WaitTimeTest();
synchronized(o)
{
try {
o.wait(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("wait(5) used time: " + (System.currentTimeMillis() - t1));
}
}
}
测试环境:
JRE: J2RE 5.0 IBM J9 2.3 Linux x86
OS: Redhat As系列
CPU:x86系列的4个cpu
测试结果
平均时间(ms)
2.4 14.8
2.6 6.1
就其原因,按我的理解是因为Linux 2.4和2.6内核调度算法从o(n)改到o(1),以及使用新的线程库NPTL的改进,使得2.6在多CPU,多线程环境下性能提高很多
http://www.ibm.com/developerworks/cn/linux/l-web26/index.html
另外,我在自己的T60,winxp上测了下sun的jdk,这个wait(5)基本需要16ms的时间;
这说明这3个环境下,IBM的JDK在2.6上的多线程调度的性能完胜了:)
作者“ERDP技术架构”