Java编码的优秀习惯(持续更新)

/ 默认分类 / 0 条评论 / 1751浏览

1、使用容器时,例如ArrayList,最好在创建时事先指定数据大小。 自动扩容虽然对码农无感,但是扩容包含两个过程:申请连续内存、数据迁移复制,还是比较耗时的。

2、需要极致性能优化的情况下,如果数组大小事先已知,且操作简单(增加,读取,指定位置更改)可以直接使用数组,不必使用ArrayList。

3、遇到遍历内存连续的数组的情况时,按照内存布局顺序访问将会带来很大的性能提升。 cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size 可以查看cpu缓存每次读取64字节到缓存区。也是如同数据库从此盘读取数据一样,一次读一个页。cpu每次从内存拿64字节。

4、循环里有if switch时,尽量保持条件属性保持有序,分布规则有序。 当代码中出现 if、switch 等语句时,意味着此时至少可以选择跳转到两段不同的指令去执行。如果分支预测器可以预测接下来要在哪段代码执行(比如 if 还是 else 中的指令),就可以提前把这些指令放在缓存中,CPU 执行时就会很快。

5、当我们分配内存时,如果在满足功能的情况下,可以在栈中分配的话,就选择栈。 怎么在栈中分配呢?静态类型语言,那么,不使用 new 关键字分配的对象大都是在栈中的。比如int i = 1; 什么时候不满足呢?超过栈大小的限制,centos是8MB。线程结束,栈内清空。 为什么多用栈内存,因为每个线程都有独立的栈,所以分配内存时不需要加锁保护,而且栈上对象的尺寸在编译阶段就已经写入可执行文件了,执行效率更高!