前幾天和同事討論設(shè)計(jì)的問(wèn)題蹋宦,關(guān)于用戶(hù)屬性的字段,表示這個(gè)用戶(hù)擁有的權(quán)限咒锻,比如對(duì)這個(gè)功能系統(tǒng)是否有5個(gè)權(quán)限,權(quán)限1有沒(méi)有守屉,權(quán)限2有沒(méi)有......惑艇。 這種屬性具有一種特征,就是非真即否拇泛,只用兩個(gè)值就可以表示滨巴。這時(shí)我們可以想到計(jì)算機(jī)的芯片的基數(shù)單元就是有電還是沒(méi)有電,也就是和計(jì)算機(jī)里面有關(guān)的一切內(nèi)容都是用bit表示的俺叭。
同樣恭取,我們對(duì)這類(lèi)值的存儲(chǔ),有很多人會(huì)偏向于這樣村熄守,5個(gè)權(quán)限分別用5個(gè)數(shù)表示蜈垮,如果都有權(quán)限耗跛,表示出來(lái)是,“1攒发,2调塌,3,4惠猿,5”羔砾。對(duì),在Java中通過(guò)判斷這字符串中有沒(méi)有相應(yīng)的數(shù)值偶妖,就知道有沒(méi)有這個(gè)權(quán)限姜凄。比如“1,2趾访,3檀葛,5” 這個(gè)字符串屬性的人就沒(méi)有4的權(quán)限。
在我看來(lái)腹缩,這種操作成本很高屿聋,需要大量的cpu進(jìn)行字符串的匹配工作。因?yàn)樵诨A(chǔ)類(lèi)型中藏鹊,String是最消耗內(nèi)存的润讥。而計(jì)算機(jī)對(duì)于二進(jìn)制位操作最為擅長(zhǎng),我們可以把剛才題例中的5個(gè)權(quán)限這樣寫(xiě)盘寡,11111楚殿,這個(gè)是個(gè)二進(jìn)制,換算成十進(jìn)制數(shù)為:63竿痰,通過(guò)&或|操作既能取出對(duì)應(yīng)操作位的值(可參考相關(guān)的符號(hào)操作)脆粥。
下面我們來(lái)看個(gè)例子:
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));
}
結(jié)果為:
flag :2
Base :121592
從結(jié)果上看,這個(gè)性能差了可不是一點(diǎn)影涉。
總結(jié)变隔,對(duì)于一些標(biāo)志位的存儲(chǔ)和判斷來(lái)看,要選擇合適的存儲(chǔ)結(jié)構(gòu)蟹倾,非常重要匣缘,一方面在存儲(chǔ)上更加節(jié)約時(shí)間,另一方面進(jìn)行計(jì)算喝判斷的時(shí)候也更加節(jié)約CPU時(shí)間鲜棠,雖然現(xiàn)在計(jì)算機(jī)發(fā)展非臣〕快,CPU和存儲(chǔ)都在飛速的發(fā)展豁陆,但是對(duì)于計(jì)算機(jī)開(kāi)發(fā)人員還是多注意這方面的內(nèi)容柑爸,節(jié)約資源。往往最后的程序緩慢就是這些微不足道的小問(wèn)題形成的盒音。
本文檔為原創(chuàng)表鳍,轉(zhuǎn)載請(qǐng)注明出處馅而。