前几天和同事讨论设计的问题,关于用户属性的字段,表示这个用户拥有的权限,比如对这个功能系统是否有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和存储都在飞速的发展,但是对于计算机开发人员还是多注意这方面的内容,节约资源。往往最后的程序缓慢就是这些微不足道的小问题形成的。
本文档为原创,转载请注明出处。