V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
javaCoder
V2EX  ›  程序员

Disruptor 了解一下,单线程却拥有多线程无可比拟的性能

  •  
  •   javaCoder · 2018-08-16 08:32:04 +08:00 · 6210 次点击
    这是一个创建于 2325 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Disruptor 了解一下,单线程却拥有多线程无可比拟的性能,原文请戳------> http://www.hchstudio.cn/article/2018/51ba/

    32 条回复    2024-07-20 23:35:51 +08:00
    hand515
        1
    hand515  
       2018-08-16 09:23:33 +08:00
    用过,在特定场景性能挺好的
    linyinma
        2
    linyinma  
       2018-08-16 09:26:23 +08:00
    很显然,单核情况下,单任务性能是最高的(为什么呢?没有多任务切换带来的损失),多任务是提高 CPU 利用率,如果有任务发送阻塞,操作系统将 CPU 交个其他任务(当然调度不是这么简单,这边只是表达设计多任务的目的),假如应用设计优秀,所有调用都非阻塞,让 CPU 一直工作,显然效率是多线程无可比拟的,这也是为什么类似 NGINX 高效的原因所在;
    javaCoder
        3
    javaCoder  
    OP
       2018-08-16 09:33:34 +08:00
    @hand515 是这样的
    javaCoder
        4
    javaCoder  
    OP
       2018-08-16 09:34:06 +08:00
    @linyinma 本身原理比较简单
    lihongjie0209
        5
    lihongjie0209  
       2018-08-16 09:39:17 +08:00
    @linyinma #2 只有在 CPU bound 的任务中你的说法才成立. IO bound 操作比如爬虫单核多线程是有用的
    iceheart
        6
    iceheart  
       2018-08-16 10:09:32 +08:00 via Android
    单进程单线程 600 万订单每秒?真的假的啊?
    javaCoder
        7
    javaCoder  
    OP
       2018-08-16 10:20:33 +08:00
    @iceheart 官方给的数据,没啥太大的问题
    cnmllll
        8
    cnmllll  
       2018-08-16 10:26:59 +08:00
    you c/c++ 版本么
    pythonee
        9
    pythonee  
       2018-08-16 10:27:40 +08:00
    适合什么场景
    javaCoder
        10
    javaCoder  
    OP
       2018-08-16 10:33:14 +08:00
    @cnmllll 应该有可以去官网了解一下
    Giki
        11
    Giki  
       2018-08-16 10:37:11 +08:00   ❤️ 4
    说一下 Disruptor 几个潜在的坑吧,
    1. event handler 的 wait strategy 要选好,一般用 blocking wait,要不然 cpu 消耗很大
    2. 当 ringbuffer 满了,event handler 速度跟不上,event publish 那边会空转等 ringbuffer 的空间,消耗额外 cpu
    3. 如果用 dependant event handler,他在等他依赖的 event handler 完成时也会空转,空转久了又耗 cpu 了
    javaCoder
        12
    javaCoder  
    OP
       2018-08-16 10:49:29 +08:00
    @Giki 感谢提醒,遇到过其中几个,不太好排查
    coolmenu
        13
    coolmenu  
       2018-08-16 11:02:49 +08:00 via iPhone
    做虚拟币交易平台可用
    wyntalgeer
        14
    wyntalgeer  
       2018-08-16 11:12:01 +08:00
    请标明是 java 的,就不用浪费时间看了
    javaCoder
        15
    javaCoder  
    OP
       2018-08-16 11:17:19 +08:00
    @wyntalgeer Disruptor 是一种编程思想,只不过是恰巧使用 java 实现了,您如果对语言有成见,出门右拐,不欢迎您看
    wyntalgeer
        16
    wyntalgeer  
       2018-08-16 11:24:09 +08:00   ❤️ 1
    @javaCoder 如果您认为 java 仅仅是个语言,那么您玩好。我的回复明确表达了已经出门右拐的意思,您还要硬艾特进我来发表攻击性的语言,干脆丰富一些 block list
    widdy
        17
    widdy  
       2018-08-16 11:36:55 +08:00
    @coolmenu 一些撮合引擎宣称百万每秒都被人批判一番,这个 600w,那不得上天!
    sugarsalt
        18
    sugarsalt  
       2018-08-16 11:37:11 +08:00
    @wyntalgeer #16 哈哈,一触即跳
    aLazarus
        19
    aLazarus  
       2018-08-16 12:27:17 +08:00
    感谢 16 楼,Block 了,提前预防
    jianpanxia
        20
    jianpanxia  
       2018-08-16 12:36:27 +08:00
    Martin Flower 应该几年前就发过文章介绍这货了..
    innoink
        21
    innoink  
       2018-08-16 12:40:40 +08:00 via Android
    这不是 n 年前就已经很成熟的技术了么
    sagaxu
        22
    sagaxu  
       2018-08-16 12:41:52 +08:00 via Android
    6M 笔交易,每笔 200 字节,10G 网卡都跑满了,亩产几十万斤
    lhx2008
        23
    lhx2008  
       2018-08-16 12:49:05 +08:00 via Android
    单线程 6m 次的话,光是打印控制台都来不及?
    neoblackcap
        24
    neoblackcap  
       2018-08-16 13:03:52 +08:00 via iPhone
    @sagaxu 一个技术很多高频交易公司都有用,跑满 10G 网卡没什么,有 bond 嘛,文章没看,不过这个技术在特定场景的确还行。比 csp,actor 那些可能还高效些
    skylancer
        25
    skylancer  
       2018-08-16 14:22:57 +08:00
    @wyntalgeer 搜了下你的帖子,全都是一些垃圾话和垃圾贴,建议你发帖前先表明本帖是垃圾帖这样我就不用浪费那几秒钟时间看你的帖了
    SimbaPeng
        26
    SimbaPeng  
       2018-08-16 14:55:44 +08:00
    @wyntalgeer 浪费了我几秒钟看你的回帖,Block
    javaCoder
        27
    javaCoder  
    OP
       2018-08-16 15:10:34 +08:00
    @lhx2008 在代码里面让线程睡了一会儿
    luozic
        28
    luozic  
       2018-08-16 15:16:11 +08:00
    ringbuffer+系统 cpu 多久缓存架构的理解导致这货这么快。
    Wicked
        29
    Wicked  
       2018-08-16 20:31:48 +08:00 via iPhone
    我写过比较粗糙的 cpp 版本,本质上还是要调好 producer 和 costumer 的平衡,因为是 ringbuffer,一旦满了就会阻塞,性能刷刷往下掉。另外也不是一个泛用的模型,只适用于特定场景。
    javaCoder
        30
    javaCoder  
    OP
       2018-08-16 21:26:38 +08:00
    @Wicked 的确是这样的
    dbpe
        31
    dbpe  
       2018-08-17 09:04:28 +08:00
    #16
    哈哈哈 没有大牛命..却有大牛病...
    loyan666
        32
    loyan666  
       159 天前
    哈哈,#16,24 年来看 18 年的破防现场,不知道 6 年过去,成为大牛没有
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:14 · PVG 14:14 · LAX 22:14 · JFK 01:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.