关于性能是很多新手程序员最关心的话题.
然而性能是最不重要的,直到有性能问题.
决定一个服务的性能,最关键是架构和算法.
合适的架构,把费时的操作放在 异步的 Job 中,或者以 P2P 的方式化解,或者用客户端的计算能力;
合适的算法,以 O(1)替代 O(N),或者以直接用 GPU 来计算;
这都是很好的办法.
如果这些都不没有解决问题,那么围观的方法才应该被考虑.
下面我们来看一幅图:
现代的 CPU 已经非常复杂,关于性能需要记住的几点是:
- 内存操作很慢,最好是不要用间接方式操作数据(例如 map[string]*struct xxx),直接复制小结构体会更好.
- 系统调用非常非常慢,而且 CPU 核心越多系统调用越慢.一次系统调用往往会导致 TLB 命中率暴降,当前 Core 的 L1 Cache 完全被刷新.
- SSD 有时候比系统调用快.
- 网络 IO 很慢,进程内的缓存远快于远程缓存.
- 缓存一致性协议非常非常重要. 在多个线程间不合适的共享一个结构体会导致灾难性的性能下降.例如用一个 Go 的 chan 在 100 个 goroutine 间共享,并高频率的读写.这会导致缓存一致性协议频繁的刷新不同 Core 的不同级别的 Cache,性能会非常低.
- 原子操作在 CPU 核心很多(>60)且高冲突的情况下,并不快.
- 线程切换非常非常的慢. 一次线程切换往往会导致缓存的命中率暴降.
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于