Go 为什么快?是上下文切换成本低吗?

2021-06-28 18:01:33 +08:00
 xmge
go 语言开发工程师,经常会被问到:go 语言为什么开发效率高呢?
好像标准答案是这样的:
1. 上下文切换成本低。go 并发使用的是协程,是用户级别的线程,在调度过程中,不用调用系统函数,不用进入内核态,因此上下文切换成本低
2. go 有自己的调度器,会比操作系统的调度过程更好,因此性能高
3. go 在创建协程时,栈空间是动态分配的,在刚开始的时候只会有 2k, 而线程的话是 2M,因此同性能机器下,go 会支持更高的并发。
4. go 相对比较简单,学习一周就能上手,因此开发效率高。

今天,想了解下第一点:go 的程序启动时也会有线程创建,为什么会说切换成本低呢?

看到一个这样的反方观点:


```
难道用了协程,线程就不切换了吗?线程的切换频率,基本取决于线程的数量,使用协程,需要指定每个线程的任务,同样的任务量,协程需要的线程数量应该始终高于自动分配的线程池。
因而:
使用线程 = 线程切换开销(小)

使用协程 = 线程切换开销(大)+ 协程切换开销
然后 CPU 开销:

线程的指令周期 = 中断检测 + 指令执行(包括取指、转换和执行)
协程的指令周期 = 中断检测 + 指令执行 + 中断检测 + 协程信号检测
所以我有以下结论:
性能上,io 多路复用 + 线程池是完全碾压协程的;但是在方便程度上,果然还是协程好用啊
```

各位大佬说一下,到底使用协程上下文切换成本是高还是低呢?
794 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/786299

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX