博客 · 第 9 页
关于工程、设计与一些随手记录。
内存布局:同样的算法,慢十倍往往是因为缓存
CPU 取一次内存要几百个周期,取整个缓存行只要一次。顺序访问与随机访问的差别往往大过算法阶数。
死锁的四个条件:破坏其中任意一个就够了
互斥、持有并等待、不可抢占、循环等待——四个同时成立才会死锁。工程上最容易破坏的是循环等待:全局给锁定一个顺序。
N+1 查询:ORM 最典型的性能陷阱
取 100 条记录再逐条查关联,就是 101 次查询。修法只有三种:预加载、批量查、或者干脆用一次 JOIN。
限流:令牌桶与漏桶的实际差别
令牌桶允许突发,漏桶把流量削成恒定速率。选错的典型症状是正常用户被限、或者限流形同虚设,取决于你的下游能不能吃突发。
灾难性回溯:正则为什么会让 CPU 打满
嵌套量词让匹配尝试数指数增长,(a+)+b 在一条长的不匹配输入上就能拖死进程。修法是去掉嵌套量词或给正则加超时。
iframe sandbox:它收窄能力,不是加固
sandbox 属性默认剥夺一切能力,靠 allow-* 逐项放回。弄反方向是常见错误:加上 sandbox 之后脚本全不能跑了,因为那是默认值。
