x=x+1,x+=1,x++效率比较

  最近在做java性能优化的总结,给部门同学分享,在网上看到帖子说到x=x+1,x+=1,x++效率比较,分析了

三种方式的效率,觉得似乎有些道理,一般的结论如下:

 


x=x+1效率最低:
<1>取右x地址
<2>执行x+1得到右值存放到临时变量
<3>取左x地址
<4>将右值传给左x(编译器并不认为左右x地址相同)

其次是x+=1:
<1>取右x地址
<2>执行x+1存放到临时变量
<3>将得到的值传给x(因为x的地址已经读出)

最快的是x++:
<1>取右x地址
<2>x自增1
 于是我把总结的帖子发表了,今天进行demo编写测试发现结果却并非如此:
代码如下:
import java.util.ArrayList;

/**
 * 
* 

Tiltle: TestXPlus.java

*

Description: 测试i=i+1,i+=1,i++的效率

* @author biyutong * @date Mar 10, 2012 8:09:52 PM * @version:V1.0 */ public class TestXPlus { /** *

Title: main

*

Description:测试i=i+1,i+=1,i++的效率

* @param args */ public static void main(String[] args) { // TODO Auto-generated method stub long s1 = System.currentTimeMillis(); Runtime.getRuntime().gc(); long startMem1 = Runtime.getRuntime().freeMemory(); System.out.println("开始内存剩余量"+startMem1); int x=0; for(int i=0;i<2000000000;i++){ //测试1 x=x+1; //测试2 //x+=1; //测试3 //x++; } long s2 = System.currentTimeMillis(); long startMem2 = Runtime.getRuntime().freeMemory(); System.out.println("用时: "+(s2-s1)+"毫秒"); System.out.println("结束时剩余内存: "+startMem2); System.out.println("内存使用量: "+(startMem1-startMem2)); ArrayList test = new ArrayList(); } }
 三个测试结果为:
 写道
//测试1
/*
*开始内存剩余量5036728
*用时: 1450毫秒
*结束时剩余内存: 5018352
*内存使用量: 18376
*/

/*测试2
*开始内存剩余量5036728
*用时: 1450毫秒
*结束时剩余内存: 5018352
*内存使用量: 18376

/*


/*测试3
* 开始内存剩余量5036728
用时: 1449毫秒
结束时剩余内存: 5018352
内存使用量: 18376

*/
 感到有些困惑,后来通过查看论坛上的帖子,觉得可能原因是在java进行编译的时候,最终的指令是一样 的,在运行时就不会有差别了。
  在此,引以为戒,不能盲目看结论,实践出真知。

 

 

你可能感兴趣的:(java,i++,效率,性能,比较)