作为一个coder,没有blog有时候都不好意思去和别人打招呼。或许现在是时候了吧。
工作时解析一个文件。 发现需要500多s才可以解析完。而半个小时内可能会吐出15个这样的文件。如果不并行计算,看样是无法解决问题了。
优化过程中,遇到很多问题,无法简单描述,也与此blog内容无关。
现在举出一个典型,同时为了说明问题,精简出代码如下
/*
* 测试一行代码的神奇
*/
public class T1 {
//2711
public static void m1(){
for(long i=0;i<8888888888l;i++)
{
if(9==i){
}
}
}
//663921
public static void m2(){
for(long i=0;i<8888888888l;i++)
{
if("9".equals(i+"")){
}
}
}
public static void main(String[] args) {
long time = System.currentTimeMillis();
m1();
System.out.println(System.currentTimeMillis()-time);
}
}
CPU corei3 双核虚拟出4线程。
任务管理器状态如下
m1 cpu25% 内存60%
m2 cpu25% 内存60%
m1和m2 内存使用都没有占满,cpu对于单线程都是满负荷状态。
选择循环8888888888次,原因是我程序中数据比对操作了80亿次以上。
输出结果:
m1执行完,只需要2711
m2执行完,需要663927
相差300倍的性能。
对于我来说是一件神奇的事情。
是因为【i+""】操作占用cpu大量的运算时间
还是equals和==性能差距太大、
那需要进一步研究。
继续测试代码
public static void m3(){
for(long i=0;i<8888888888l;i++)
{
if("9".equals("9")){
}
}
}
public static void m4(){
for(long i=0;i<8888888888l;i++)
{
if("9"=="9"){
}
}
}
m3和m4执行速度结果也近乎一样。
看起来证明至少在这里equals和==性能差距不大。
那就是因为【i+""】操作占用cpu大量的运算时间了?
我所能理解的是【i+""】会去内存申请空间并放入运算结果。但因为如此造成了300倍运算性能的差距?不禁要说太神奇了。
那为什么会造成这样的结果?或许我无法再去测试了。
这个问题激发了我的求知欲望,要去看看编译器或者深入学习虚拟机?
哎,还有工作,暂且放下吧。现在的我不懂,不代表将来的我不会。
术业有专攻,我还无法回答这个问题。您知道吗?