V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xmge
V2EX  ›  程序员

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

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

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

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


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

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

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

    各位大佬说一下,到底使用协程上下文切换成本是高还是低呢?
    目前尚无回复
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3768 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 01:15 · PVG 09:15 · LAX 18:15 · JFK 21:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.