Today I Learnt

Today I Learnt

发表于更新于阅读时长 1 分钟

阅读更多

2022.03.22 ES module 中不能 named import commonjs 是因为前者的 export item 是在执行前静态计算的,而后者的是在运行期生成的

2022.05.14 JVM 上传统的 GC mark 时需要较长时间的 STW,而新出的 Shenandoah 和 ZGC 的都选择通过 read barrier 来完成极短 STW 时间

2023.01.02 memory order

级别 作用 用途
Relaxed - 计数器
Acquire
Release
Acquire 时之前别的线程的所有读写都可见,Acquire 之后的读写不会被重排到 Acquire 之前
Release 时之后所有读写都对别的线程可见,Release 之后的读写不会被重排到 Release 之后
Sequencial Consisitency 对多个原子变量的更改有全局一致的顺序 有依赖关系的锁

2023.01.07 不同平台的 I/O 事件通知机制

dsada epoll kqueue Event Port IOCP
创建实例 epoll_create kqueue port_create CreateIoCompletionPort
监听事件 epoll_ctl kevent port_associate CreateIoCompletionPort
取消监听事件 epoll_ctl kevent port_disassociate -
接收事件(阻塞) epoll_wait kevent port_get/port_getn GetQueuedCompletionStatusEx/GetQueuedCompletionStatusEx

其中大部分是 Readiness based(可以开始读取数据时通知),ICOP 是 Completion based(读取数据完成时通知)

2023.03.14 TS 和 Haskell 一样,支持一定程度的 recursive type/coinductive type

ts
function fib(m: number, n: number): [number, () => ReturnType<typeof fib>] {
return [m, () => fib(n, n + m)]
}
haskell
fib m n = m : fib n (m + n)

2023.05.03 rust 中禁止形如.0的字面量是因为无法避免a.0的二义性

2023.06.02 Wasm 中无法访问程序栈,因此 GC 无法找到在栈上的引用,为此一些实现会在 data segment 前/后把引用再分配一遍,扫描的时候从这里开始。这种技术被称为 shadow stack

2024.05.11 CPU 的 L1 缓存区分指令缓存和数据缓存的原因是指令缓存是单个核心独享,可以省掉核心间同步机制

2024.10.26 不可变 avl tree 一般高度差大于 2 才旋转,因为它的旋转成本比较高

© 2016 - 2024Austaras Devas