关于性能是很多新手程序员最关心的话题.
然而性能是最不重要的, 直到有性能问题.
决定一个服务的性能, 最关键是架构和算法.
合适的架构, 把费时的操作放在 异步的 Job 中, 或者以 P2P 的方式化解, 或者用客户端的计算能力;
合适的算法, 以 O(1) 替代 O(N), 或者以直接用 GPU 来计算;
这都是很好的办法.
如果这些都不没有解决问题, 那么围观的方法才应该被考虑.
下面我们来看一幅图:
media20160803jpg
现代的 CPU 已经非常复杂, 关于性能需要记住的几点是:

  • 内存操作很慢, 最好是不要用间接方式操作数据 (例如 map[string]*struct xxx), 直接复制小结构体会更好.
  • 系统调用非常非常慢, 而且 CPU 核心越多系统调用越慢. 一次系统调用往往会导致 TLB 命中率暴降, 当前 Core 的 L1 Cache 完全被刷新.
  • SSD 有时候比系统调用快.
  • 网络 IO 很慢, 进程内的缓存远快于远程缓存.
  • 缓存一致性协议非常非常重要. 在多个线程间不合适的共享一个结构体会导致灾难性的性能下降. 例如用一个 Go 的 chan 在 100 个 goroutine 间共享, 并高频率的读写. 这会导致缓存一致性协议频繁的刷新不同 Core 的不同级别的 Cache, 性能会非常低.
  • 原子操作在 CPU 核心很多 (>60) 且高冲突的情况下, 并不快.
  • 线程切换非常非常的慢. 一次线程切换往往会导致缓存的命中率暴降.
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品: PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    3046 引用 • 3713 回帖 • 661 关注
  • 性能
    24 引用 • 145 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    201 引用 • 904 回帖 • 811 关注
感谢    赞同    分享    收藏    关注    反对    举报    ...