今天发生了一起事故,追查下去,找到了一段陈年老代码。
代码逻辑很简单:
<?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');
}
这个写法不香吗?
最后
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾:
技术
- 秒杀系统
- 分布式系统与一致性协议
- 微服务之服务框架和注册中心
- Beego框架使用
- 浅谈微服务
- TCP性能优化
- 限流实现1
- Redis实现分布式锁
- Golang源码BUG追查
- 事务原子性、一致性、持久性的实现原理
- CDN请求过程详解
- 常用缓存技巧
- 如何高效对接第三方支付
- Gin框架简洁版
- InnoDB锁与事务简析
- 算法总结
读书笔记
思考