现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升,

但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比较短的同学挺有意义的。

一 循环条件下,循环体和判断条件中,都要避免对使用复杂表达式,减少对变量的重复计算

1.在循环中应该避免使用复杂的表达式。

在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快。

比如:

for(int i=0;i

可以改为//我的电脑上,测试数量级在10^7,速度提升一倍。

for(int i=0,len=list.size();i

二 更好的使用变量

1.合理使用final修饰符

注意fina修饰变量或者方法时的用法不同。很多时候使用"static final 变量"格式是很好的选择。

2.尽量避免不必要的创建,同时避免使用随意使用静态变量

GC通常是不会回收静态变量对象所占有的内存,所以要合理的使用静态区域代码。

3.使用基本数据类型代替对象

Java中,String对象主要由3部分组成:

char数组、偏移量和String的长度。

String str = "hello"; //创建一个“hello”字符串,而且JVM的字符缓存池还会缓存这个字符串;

String str = new String("hello")//此时程序除创建字符串外,str所引用的String对象底层还包含一个char[]数组,这个char[]数组依次存放了h,e,l,l,o

二 更高效的使用字符串

1.对于常量字符串,用‘string‘ 代替 ‘stringbuffer‘,但是在需要String对象做累加操作的场合,使用StringBuilder或者StringBuffer;

另外,在单线程或者无需考虑线程安全的情况下,使用性能相对较好的StringBuiler(单人盖房,多人缓冲)。

2.使用更好的办法分割字符串

《Java程序性能优化》一书中指出,split()方法支持正则表达式,功能强大,但是效率最差;StringTokenzer性能优于split()方法。如果可以自己实现分割算法,性能可以做到最优,但是考虑到可读性可维护性等,可以使用StringTokenizer。

在代码中验证一下:

StringBuilder sb=newStringBuilder();for(int i=0;i<100000;i++){

sb.append(i);

sb.append(",");

}

String str=sb.toString();

Long time1=System.currentTimeMillis();

String[] split=str.split(",");

Long time2=System.currentTimeMillis();

System.out.println(time2-time1);

Long time3=System.currentTimeMillis();

StringTokenizer st=new StringTokenizer(str,",");

String[] strToken= new String[10000];for(int i=0;i<100000;i++){while(st.hasMoreTokens()){

strToken[i]=st.nextToken();

}

}

Long time4=System.currentTimeMillis();

System.out.println(time4-time2);

在自己的电脑上分割10000次时,StringTokenizer平均要快3ms左右(额,好像相差也不大)。

三 根据线程安全要求选用合理的数据结构

1.单线程应尽量使用HashMap、ArrayList

在单线程环境下,尽量避免使用一些针对多线程环境做了优化的集合工具。

比如,避免StringBuffer和StringBuilder,HashMap(单线程地图)和HashTable(多线程表格)等的随便使用。

2.减小synchronized作用的区域

同步方法的系统开销比较大,尽量在真正需要同步的地方使用synchronized关键字。

四 合理选用集合工具类

1.使用Vector、HashTable、HashMap等部分自动扩充的数据结构时,指定初始大小

查看Vector的源码,会发现定义了initialCapacity、capacityIncrement,用来指定初始容量和集合充满后的自动扩充大小,

Vector在初始化时,默认的容量大小是10,大部分时候这个容量是不够的,都会进行扩充操作。

比如:

public vector v = new vector(20);

2.尽量避免使用二维数组

相比一维数组,二维数组的效率比较低,相差可以达到10倍。以前做过的一些数据结构或者算法题目里面,

比如一维数组替代二维数组表示坐标系,因为考虑到时空开支,可以用下标和值分别表示纵横坐标。

3.使用System.arraycopy()代替通过来循环复制数组

五 语句控制结构中的注意

1.java中使用final关键字来指示一个函数为内联函数,final关键字会告诉编译器,在编译的时候考虑性能的提升

内联函数就是在程序编译时,编译器将程序中出现 的内联函数的调用表达式用内联函数的函数体来直接进行替换。理解内联函数,可以类比C语言的宏定义。

2.在文件读写,访问链接等操作中,相关的资源可以在finally块中释放

六 一些提升性能的数学计算

1.和C语言一样,乘除法如果可以使用位移,应尽量使用位移

通常如果需要乘以或除以2的n次方,都可以用移位的方法代替,

在Java中是左移、有符号右移和无符号右移运算符。位移运算符只对int值进行操作,如果不是int,编译器会报错。

a=a*4;

b=b/4;//可以改为:

a=a<<2;

b=b>>2;//说明://除2 = 右移1位 乘2 = 左移1位//除4 = 右移2位 乘4 = 左移2位//除8 = 右移3位 乘8 = 左移3位

原文:http://www.cnblogs.com/binyue/p/4213535.html

java怎样将乘法优化成位移乘法_Java性能优化:程序优化相关推荐

  1. Java背景颜色怎么设成随机的_java - 如何将按钮的背景设置为具有设置约束的随机颜色? - SO中文参考 - www.soinside.com...

    这是错的: for (int i = 0; i < arrayButtons.length; i++) { arrayButtons[i].setDrawColor(new Color(rand ...

  2. Java时间带T转成正常时间_java是时间戳和时间的转换,时间戳比较时间大小,日月年转换成年月日...

    我的项目现在的处境: 数据库存的时间是时间戳 , 页面显示的是'2018-04-12  或者 2018-04-12 12:00:00'这种格式: 时间戳转换时间: String timeStr1 = ...

  3. 一个java类运行时从哪个方法开始_Java的应用程序是从类中的

    [填空题]还不走,车来了. [填空题]进路是 运行时所经由的路径. [单选题]()是仿照法国巴黎圣母院设计建造的: [简答题]结合你学习的感受,你认为会计核算程序三大会计要素顺序可以颠倒吗? [填空题 ...

  4. 【小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)

    前言 大家好,我是HoMeTown,最近要做一个小程序的项目,项目启动之前,回顾自己之前做过的小程序,感觉做的还是不够好,最近学习了一下小程序优化方案,这块总结一份个人笔记,以便参考,同时分享给大家, ...

  5. 如何在CPU上优化GEMM矩阵乘法

    如何在CPU上优化GEMM矩阵乘法 How to optimize GEMM on CPU (TL;DR) TVM 提供抽象接口,允许用户分别描述算法和算法的实现组织(所谓的调度).通常,在高性能调度 ...

  6. 【小嘟陪你刷题04】Java实现水花仙数、九九乘法表、金字塔

    目录 前言 实现水花仙数 九九乘法表 金字塔 前言 此篇是对一些Java基础知识的复习! 实现水花仙数 //使用三种循环方式去实现水仙花数//水仙花数是3位数的特点//1.使用while循环输出所有的 ...

  7. java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...

    [九九乘法表]九九乘法表学习攻略九九乘法表快速记忆小诀窍 很多孩子的九九乘法表还是背的不熟练,下面是精心为大家整理的九九乘法表学习攻略,欢迎阅读.更多九九乘法表学习攻略相关内容请关注实用资料栏目! & ...

  8. java list最大容量_Java 性能优化:35 个小细节,提升你的 Java 代码运行效率

    优质文章,及时送达 作者 | 萌小Q 来源 | cnblogs.com/Qian123/p/6046096.html 上篇 | 为什么我不建议你去外包公司? 前言 代码优化 ,一个很重要的课题.可能有 ...

  9. java 强制转换 效率_Java 性能优化:35 个小细节,让你提升 Java 代码的运行效率...

    代码优化细节 1.尽量指定类.方法的final修饰符 2.尽量重用对象 3.尽可能使用局部变量 4.及时关闭流 5.尽量减少对变量的重复计算 6.尽量采用懒加载的策略,即在需要的时候才创建 7.慎用异 ...

最新文章

  1. 继AutoML后,第四范式发布软硬一体化AI集成系统SageOne
  2. java xml文件内容替换_java读取xml文件并转换成对象,并进行修改
  3. 2018年东北农业大学春季校赛 E 阶乘后的0【数论】
  4. 马云:我不懂技术但欣赏技术 达摩院必须超越微软 - 20171011
  5. Java 开发者必备手册开放下载!
  6. 2020.11.me
  7. 计算机检索高考投档线,投档分数线是什么意思 2018各大学投档线是多少
  8. 4 张动图解释为什么(什么时候)使用 Redux
  9. 用户体验设计的五个原则(转)
  10. 负载均衡工具 haproxy 集群安装部署完整流程
  11. 只有设置了 name 属性的表单元素才能在提交表单时传递它们的值
  12. 建立一个mysql 文件命令是_使用命令行创建数据库
  13. 阿里舆情︱舆情热词分析架构简述(Demo学习)
  14. python实现将将输入的可约分数化简为不可约分数
  15. 手机app登录显示服务器异常,手机app 连接云服务器异常
  16. matlab中的fig文件怎么编辑,matlab fig文件的操作
  17. 基于android酒店点餐系统设计,基于Android的餐厅点餐系统的设计与实现
  18. centos win xp双系统 安装手记 9660 grldr U盘安装
  19. 完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三_zzjlzx-ChinaUnix博客...
  20. js获取微信号_前端js可以直接获取到微信用户基本信息吗

热门文章

  1. win10 调用计算机,win10系统打开软件总提示是否允许程序修改计算机的解决方法...
  2. react 购物车组件
  3. flinkSQL Table转DataStream
  4. C语言:srand函数与rand函数的使用(纯干货)【易懂】
  5. 图构建:领域本体设计原则与动态本体
  6. 计算机网络(一)——网络编程
  7. 我在淘宝做前端的这三年 — 第一年
  8. pfx文件解析私钥和公钥
  9. RTSP 协议详细介绍
  10. 接口参数加解密,代码无侵入这样做方便多了