Java 位操作的性能到底有多高

前几天和同事讨论设计的问题,关于用户属性的字段,表示这个用户拥有的权限,比如对这个功能系统是否有5个权限,权限1有没有,权限2有没有......。 这种属性具有一种特征,就是非真即否,只用两个值就可以表示。这时我们可以想到计算机的芯片的基数单元就是有电还是没有电,也就是和计算机里面有关的一切内容都是用bit表示的。

同样,我们对这类值的存储,有很多人会偏向于这样村,5个权限分别用5个数表示,如果都有权限,表示出来是,“1,2,3,4,5”。对,在Java中通过判断这字符串中有没有相应的数值,就知道有没有这个权限。比如“1,2,3,5” 这个字符串属性的人就没有4的权限。

在我看来,这种操作成本很高,需要大量的cpu进行字符串的匹配工作。因为在基础类型中,String是最消耗内存的。而计算机对于二进制位操作最为擅长,我们可以把刚才题例中的5个权限这样写,11111,这个是个二进制,换算成十进制数为:63,通过&或|操作既能取出对应操作位的值(可参考相关的符号操作)。

下面我们来看个例子:

publicstaticvoidtest() {

     intflagInt= 432;

     intloop= 1000000000;

     StringstrFlag="1,2,4";

     longtime1= System.currentTimeMillis();

     while(loop> 0) {

           intb=flagInt& 7;

           loop--;

     }

     System.out.println("flag :"+(System.currentTimeMillis() -time1));

     loop= 1000000000;

     longtime2= System.currentTimeMillis();

     while(loop>0) {

           String[]trpp=strFlag.split(",");

           loop--;

     }

     System.out.println("Base :"+(System.currentTimeMillis() -time2));

}

结果为:

flag :2

Base :121592

从结果上看,这个性能差了可不是一点。

总结,对于一些标志位的存储和判断来看,要选择合适的存储结构,非常重要,一方面在存储上更加节约时间,另一方面进行计算喝判断的时候也更加节约CPU时间,虽然现在计算机发展非常快,CPU和存储都在飞速的发展,但是对于计算机开发人员还是多注意这方面的内容,节约资源。往往最后的程序缓慢就是这些微不足道的小问题形成的。

本文档为原创,转载请注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容