今天發生了一起事故,追查下去,找到了一段陳年老程式碼。
程式碼邏輯很簡單:
<?php
$a = 1;
$b = 8;
if ($a & $b) {
var_dump('same');
} else {
var_dump('not same');
}
複製程式碼
這個程式碼的作用是什麼呢?判斷a與b是否相等。
為什麼能判斷呢?或者說什麼條件下這個邏輯是生效的?
聰明的你可能有了答案,當a和b都是2^n的時候。
在位與運算的時候,只有完全一樣a&b才能大於零,否則,每一位必然會有一個0,最終結果為0,表示不相等。
這個算是比較巧的寫法(這麼寫的人少),另外理論上這個操作比直接判斷相等是要快一些的。
但是卻隱藏了兩個極大的問題
- 數值增長會很快,迅速達到越界的範圍,畢竟指數增長啊
- 如果這個邏輯一直是由同一個人維護還好,知道賦值必須為2^n,如果程式碼交接給別的組或者換了一個新人,極有可能不知道這點,賦值的時候沒有遵循指數規則,然後就悲劇了
墨菲定律說的是個概率問題,感覺世上的事情沒啥能逃脫統計,然後果然就悲劇了。對於系統來說,一個&值多少錢,可能一文不值,也可能是天價。
後來我想了想,在程式碼層面至少有兩個問題
- 如果接手別人的程式碼,一定要看一遍,另外對裡面不符合常理的地方一定要跟進,這些地方往往是定律的藏身之所
- 寫程式碼的時候,通俗易懂是最重要的,不要去炫技,也不要為了炫技而埋了坑。就對上面舉例的程式碼而言,即沒有充分利用每一個數字,而且很可能引發錯誤,另外其實也提升不了多少效能,優化優化邏輯、改改演算法,效能不會比這個提升的多?
最後說一句:
<?php
$a = 1;
$b = 8;
if ($a == $b) {
var_dump('same');
} else {
var_dump('not same');
}
複製程式碼
這個寫法不香嗎?
最後
大家如果喜歡我的文章,可以關注我的公眾號(程式設計師麻辣燙)
我的個人部落格為:http://shidawuhen.github.io/
往期文章回顧:
技術
- 秒殺系統
- 分散式系統與一致性協議
- 微服務之服務框架和註冊中心
- Beego框架使用
- 淺談微服務
- TCP效能優化
- 限流實現1
- Redis實現分散式鎖
- Golang原始碼BUG追查
- 事務原子性、一致性、永續性的實現原理
- CDN請求過程詳解
- 常用快取技巧
- 如何高效對接第三方支付
- Gin框架簡潔版
- InnoDB鎖與事務簡析
- 演算法總結
讀書筆記
思考