• 30个精简代码的小技巧(第11-20个)


    接上一篇  30个精简代码的小技巧(第1-10个)

    11.乘法和除法使用移位操作

            如:
            for(val = 0;val < 100000;val += 5) {
                a = val * 8;
                b = val / 2;
            }
            用移位操作可以极大的提升性能,因为在计算机底层,对位的操作是最方便的。
            可以替换为:
            for(val = 0;val < 100000;val += 5) {
                a = val << 3;
                b = val >> 1;
            }
            注: 移位操作虽然方便,但是可能使代码不太好理解,因此需要加上相应的注释。

     

    12.循环内不要不断创建对象引用

            如:
            for(int i = 0;i <= count; i++) {
                Object obj = new Object();
            }
            这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,可以替换为:
            Object obj = null;
            for(int i = 0;i <= count;i++) {
                obj = new Object();
            }
            这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object而已,但是内存中只有一份,就可以节省很多内存空间了。

    13.基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList。

    14.尽量使用除非线程安全需要,否则不推荐使用Hashtable,Vector,StringBuffer,后三者由于使用同步机制而导致了性能开销。

    15.不要将数组声明为public static final

            因为这样毫无意义,这样知识定义了引用为static,final,数组的内容还是可以随意改变的,将数组声明为一个public更是一个安全漏洞,这意味着整个数组可以被外部类所改变。

    16.尽量在何时的场合使用单例

            使用单例可以减轻加载的负担,缩短加载时的时间,提高加载的效率,但并不是所有的地方都适用于单例,简单说,单例主要适用于以下三个方面:

                (1) 控制资源的使用,通过线程同步来控制资源的并发访问;

                (2) 控制实例的产生,达到节约资源的目的;

                (3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

    17.尽量避免随意使用静态变量

            因为当某个对象被定义为static时,gc通常是不会回收这个对象所占有的堆内存的,如:

            public class A {
                private static B b = new B();
            }

            此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会一直存在内存中,直到程序终止。

    18.及时清除不再需要的会话

            当应用服务器需要保存更多会话时,如果内存不足,操作系统会把部分数据转移到磁盘里,应用服务器也可能根据MRU(最近频繁使用的会话)算法,把部分不活跃的会话转存到磁盘里,甚至可能抛出内存不足的异常。如果会话要被转存到磁盘,就必须先序列化,在大规模集群中,对对象进行序列化代价是很大的。因此,应及时调用HttpSession的invalidate()方法清除会话。

    19.实现RandomAccess接口的集合比如ArrayList,应当使用for循环而不是foreach来遍历

            JDK API对于RandomAccess接口的解释是:实现RandomAccess接口用来表明其支持快速随机访问,此接口的主要目的是允许一般的算法更改其行为,从而将其应用到随机或连续访问列表时能够提供良好的性能。

            实现RandomAccess接口类实例,加入是随机访问的,使用for循环比foreach效率高;如果不是随机访问的使用foreach效率高。

            如:
                if(list instanceof RandomAccess) {
                    for(int i = 0 ;i < list.size();i++){} 
                } else {
                    for(List li : list) {
                        System.out.println(li);
                    }
                }

                foreach底层实现原理就是迭代器(iterator)

    20.使用同步代码块代替同步方法

            除非能确定整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要同步的代码也进行同步,从而影响效率。

     

    喜欢的小伙伴们可以搜索我们个人的微信公众号“程序员的成长之路”点击关注或扫描下方二维码

  • 相关阅读:
    超分网络一般不需要BN
    常用的损失函数loss
    VS Code导入torch后出现红色下划线警告
    光流算法:Horn–Schunck光流讲解
    网络训练loss不下降的问题
    l1,l2loss的比较
    Nvidia DALI加速数据增强
    pytorch将部分参数进行加载
    模型训练技巧
    node 特性及优缺点
  • 原文地址:https://www.cnblogs.com/cxydczzl/p/9639340.html
Copyright © 2020-2023  润新知