Java优化技巧
过早的优化是万恶之源。
优化了的代码可读性变差,可改性可适应性变差,可维护性变差。
远离过度优化,优化是个无底洞,把主要精力放在代码逻辑上。
优化的代码是活在当下的,是严重依赖硬件的,不利于表达永恒的思想。
许多优化编译器已经做了,如果再做有可能适得其反,既然是高级语言还是要集中精力在逻辑上而不是运行效率上。
Java在计算密集型程序上运行效率高于C++,但只要涉及反复开辟释放空间,反复输入输出操作,Java就虚了。
一.减少值传递,多用引用传递(C++)
至于其中的原因,相信大家也很清楚,如果参数是int等语言自定义的类型可能能性能的影响还不是很大,但是如果参数是一个类的对象,那么其效率问题就不言而喻了。例如一个判断两个字符串是否相等的函数,其声明如下:
bool Compare(string s1, string s2)
bool Compare(string *s1, string *s2)
bool Compare(string &s1;, string &s2;)
bool Compare(const string &s1;, const string &s2;)
其中若使用第一个函数(值传递),则在参数传递和函数返回时,需要调用string的构造函数和析构函数两次(即共多调用了四个函数),而其他的三个函数(指针传递和引用传递)则不需要调用这四个函数。因为指针和引用都不会创建新的对象。如果一个构造一个对象和析构一个对象的开销是庞大的,这就是会效率造成一定的影响。
然而在很多人的眼中,指针是一个恶梦,使用指针就意味着错误,那么就使用引用吧!它与使用普通值传递一样方便直观,同时具有指针传递的高效和能力。因为引用是一个变量的别名,对其操作等同于对实际对象操作,所以当你确定在你的函数是不会或不需要变量参数的值时,就大胆地在声明的前面加上一个const吧,就如最后的一个函数声明一样。同时加上一个const还有一个好处,就是可以对常量进行引用,若不加上const修饰符,引用是不能引用常量的。
二.++i和i++,前置运算和后置运算
i++会开辟一个临时变量用来返回,++i直接更改数据。所以++i效率较高。
三.循环内定义变量和循环外定义变量
请看下面的两段代码:
代码1:
for(int i = 0; i < 100; ++i)
{
CT = a;
//do something
}
代码2:
for(int i = 0; i < 100; ++i)
{
ClassTest CT = a;
//do something
}
你会觉得哪段代码的运行效率较高呢?代码1还是代码2?其实这种情况下,哪段代码的效率更高是不确定的,或者说是由这个类ClassTest本向决定的,分析如下:
对于代码1:需要调用ClassTest的构造函数1次,赋值操作函数(operator=)100次;对于代码2:需要调用(复制)构造函数100次,析构函数100次。
如果调用赋值操作函数的开销比调用构造函数和析构函数的总开销小,则第一种效率高,否则第二种的效率高。
四.一个大循环 or 多个小循环
如果循环过大,超过Cache的一页,则会不停地发生“未命中”。而若干个小循环每次都会命中。但是大循环程序跳转次数少。二者各有利弊。
五.局部变量 优于 静态变量:尽量使用局部变量
局部变量当然是存在于堆栈中,堆栈实际上也是一块内存空间。因为堆栈存放的位置比较集中,所以堆栈总是被频繁访问,于是内存中堆栈数据从内存加载到Cache中,所以访问堆栈速度快,因为总是轻易命中。而静态变量所在空间有可能并没有加载到Cache中。
六.多用final
- 为类指定final,则类不可继承,这个类的全部方法也都是final的。
- 为函数指定final,则派生类不可覆盖这个函数
- 为变量指定final,若变量为引用类型,则变量引用不可更改;若变量为值类型,则变量相当于常量。
使用final的函数,有利于Java编译器进行内联,从而提高运行效率,内联对于Java运行效率意义重大,效果明显。所以多多使用final来修饰类、函数、变量
七.装箱拆箱会影响效率
使用ArrayList<Node>
比使用ArrayList<Integer>
效率高,因为Integer涉及到拆箱装箱。
- 装箱:在值类型向引用类型转换时发生,在堆中分配。
- 拆箱:拆箱在引用类型向值类型转换时发生。
可见,执行装箱操作时不可避免的要在堆上申请内存空间,并将堆栈上的值类型数据复制到申请的堆内存空间上,因此消耗内存和cpu资源。
八.尽量一次性申请大空间,不要频繁申请小空间
每次开辟空间都需要java虚拟机之外的事物来参与(其实就是操作系统参与),Java虚拟机内部速度很快,但一旦与外界打交道就变慢了。所以要尽量考虑少new 一些东西。比如ArrayList
效果可能比LinkedList
效果好,因为ArrayList不会每次插入删除都进行内存申请释放。
最典型的应用时“链式前向星”,它就是一次性开辟一个大的数组,来实现一个链表结构。
开辟大空间也是很浪费时间的,如下代码耗时4s
public class GetSpace {
final int HASH_SZ = 4277777;
final int[][] father = new int[HASH_SZ][10];
final int[][] son = new int[HASH_SZ][10];
public static void main(String[] args) {
long startTiem = System.currentTimeMillis();
new GetSpace();
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTiem) / 1000);
}
}
参考资料
http://chuansong.me/n/1013527
https://zhuanlan.zhihu.com/p/23390311
Java优化技巧的更多相关文章
- JAVA优化技巧分享 让游戏更加的流畅
我的世界怎么样可以玩的更加流畅呢?怎么对游戏进行优化呢?相信很多小伙伴都很想知道吧,今天小编为大家带来的是我的世界游戏优化技巧,喜欢的小伙伴不要错 ... 在很多时候如果电脑配置过低的话,玩游戏并不流 ...
- Java程序性能优化技巧
Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...
- JAVA中的优化技巧(适用Android)
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...
- 【转】MyEclipse 2015优化技巧
MyEclipse 2015优化技巧 MyEclipse 2015优化速度方案仍然主要有这么几个方面:去除无需加载的模块.取消冗余的配置.去除不必要的检查.关闭更新. 第一步: 去除不需要加载的模块 ...
- [转] Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- Python代码性能优化技巧
摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- Oracle SQL性能优化技巧大总结
http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...
随机推荐
- 不明白的sizeof(enum)数据结构存储问题
不明白的sizeof(enum)数据结构存储问题 typedef struct weekday_st { enum week {sun=123456789,mon,tue,wed,thu,fri,sa ...
- 0, \0, NULL
字符串.字符数组输入.输出与'\0'的问题 原创首发,欢迎转载! 作者按 字符串.字符数组以"%s"格式输入时,以遇到'空格'为这个字符串输入结束. 字符串.字符数组以" ...
- 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...
- 第六章 企业项目开发--cookie
注:本章代码基于<第五章 企业项目开发--mybatis注解与xml并用>的代码,链接如下: http://www.cnblogs.com/java-zhao/p/5120792.html ...
- mongo文本搜索的一个例子
假如有一个名为articles的集合,数据如下: { "_id" : 1, "title" : "cakes and ale" } { ...
- [Backbone] Parse not formatted JSON code
The good Dr. recently had another team implement the server and they slightly messed up the format o ...
- JavaScript高级程序设计(第3版)学习笔记·第8章——浏览器对象模型BOM
转自:http://www.shaoqun.com/a/43768.aspx 访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model),但习惯上是把所有针对浏览器 ...
- ZH奶酪:AngularJS判断checkbox/复选框是否选中并实时显示
最近做了一个选择标签的功能,把一些标签展示给用户,用户选择自己喜欢的标签,就类似我们在购物网站看到的那种过滤标签似的: 简单的效果如图所示: 首先看一下html代码: <!DOCTYPE htm ...
- Appium Python 四:怎样获取APP的Package以及Activity
看到一篇很好的博客:[Android测试][随笔]获得App的包名和启动页Activity 除了博客上的方法,我还找到两种方法: 方法一:aapt 前提需要使用SDK Manager.exe 下载 A ...
- [置顶] macbook 深度休眠和待机
开发用了macbook pro, 10.8.3, 因为用windows的习惯,一直比较习惯不关机,直接休眠,不是待机standby,今天找到了一个工具,可以实现,亲测通过. 下载:https://gi ...