在上文Lua coroutine 不一样的多线程编程思路 中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下。

源代码

Lua code

co = coroutine.create(function(loops)for i = 1, loops docoroutine.yield()end
end)local x = os.clock()
local loops = 100 * 1000 * 1000
coroutine.resume(co, loops)
for i = 1, loops docoroutine.resume(co)
end
print(string.format("elapsed time: %.2f\n", os.clock() - x))

Java code

public class TestWait {public static void main(String[] args) {WaitClass wc = new WaitClass();wc.start();int loops = 100 * 1000 * 1000;long t1 = System.currentTimeMillis();for (int i = 0; i < loops; i++) {synchronized (wc) {wc.notify();}}long t2 = System.currentTimeMillis();System.out.println("elapsed time: " + (t2 - t1) / 1000l);}
}class WaitClass extends Thread {public void run() {while (true) {synchronized (this) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}
}

运行结果

Lua elapsed time: 53.36
Java elapsed time: 51

CPU占用

运行环境:4core XEON

Lua 1CPU 100%, 其他CPU0%, total 25% (其中CPU sys 0%)

Java 2个CPU 40%-50%, 其他CPU 0%, total 25% (其中CPU sys 5%-10%)

从结果看,coroutine只利用了一个CPU, 和原理所说完全一致。

Java利用了2个CPU, 各占用了50%的CPU时间运行和50%的时间等待,和设计也一致。另外Java用了5-10%的sys CPU时间用于线程context switch

结论

虽然这两种程序没有直接可比性,但仍然可以看出一些有趣的地方:

  • Lua虽然在各种性能评比中performance比Java低一个数量级,但在这个场景中也跑平了Java
  • Java为了调用notify/wait, 用了同步锁,因此测试场景对Java不利。

再谈coroutine应用场景

今天又看到qiezi的文章并发编程模型:Thread, Coroutine, Callback … 分析得很深入,对这方面感兴趣的可以进一步去深入了解。

另外qiezi在Coroutine在并发程序中的应用中提到四种场景,可以理解是对我上篇文章对coroutine应用场景的一种答案。

  1. 状态机。
  2. 异步IO操作:异步IO操作通常是发起一个IO请求,由操作系统完成以后回调指定的方法或者使用其它方式通知。
  3. 高并发网络服务器,高并发服务器除了要处理场景一的情况外,可能还要结合场景二,多线程方案有时候完全不能接受,更多的是基于事件、异步IO或者是混合事件和多线程的模型。
  4. 客户端并发应用

但是我还是觉得存在疑虑,后面几种我觉得用多线程/线程池模式也可以很好解决。其实select/epoll异步IO方式跟多线程并不矛盾。多线程并不代表每个线程需要recv阻塞在那里。目前网络服务器的多线程通常是指业务逻辑处理部分使用多线程。比如Java中用mina来处理连接(相当于epoll),mina在收到数据包之后再分发给负责业务逻辑的thread pool处理。如果是CPU密集型任务,简单把线程池的线程数设成CPU数即可达到性能最佳。这时如果把线程数设成1,就很类似coroutine模式了。而Java模式所增加的消耗,主要是new runnable class以及线程池调度的开销。

转载于:https://blog.51cto.com/timyang/307673

Lua coroutine vs Java wait/notify相关推荐

  1. lua java 性能比较_Lua coroutine vs Java wait/notify

    在上文Lua coroutine 不一样的多线程编程思路中想到coroutine的运行机制跟Java中的wait/notify很相似,所以写了一个简单程序比较一下. 源代码 Lua code co = ...

  2. Lua coroutine 不一样的多线程编程思路

    上周末开始看<Lua程序设计>第二版,目前体会到其中比较有趣的有两点,一是强大的table数据结构,另外就是coroutine.也许Lua中的coroutine是一种很好的设计模式,但我初 ...

  3. Java wait notify

    2019独角兽企业重金招聘Python工程师标准>>> Java wait && notify ‍wait.notify和notifyAll方法是Object类的fi ...

  4. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  5. java thread.notify,Java Thread notify()方法

    Java Thread notify()方法 java.lang.Thread.notify() 方法用于唤醒单个线程.此方法仅针对正在等待特定对象的一个线程给出通知.如果我们使用notify() 方 ...

  6. Java之notify和notifyAll区别

    在Java中notify()和notifyAll()方法都是Object对象用于通知处在等待该对象的线程的方法. 两者的最大区别在于: notifyAll方法 使所有原来在该对象上等待被notify的 ...

  7. Cocos2dx中lua实现与java交互(异步线程间的数据同步)

    语言环境 Cocos2dx 3.6 lua 5.1 java 1.8.0_144 本节问题: lua 通过 luaj与java交互,在java中,如何回调lua?若要处理的事件代码必须在多线程中执行, ...

  8. lua coroutine

    Lua Coroutine详解 chiguozi关注 2016.08.27 22:10:39字数 776阅读 8,844 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针 ...

  9. Coroutine in Java - Quasar Fiber实现--转载

    转自 https://segmentfault.com/a/1190000006079389?from=groupmessage&isappinstalled=0 简介 说到协程(Corout ...

最新文章

  1. C 线程中容易忽视的 restrict 修饰符修饰
  2. CUR分解算法及Python实现
  3. 统计学---极端异常值的检测
  4. MySQL分组查询—按函数分组
  5. 【GISER Painter】矢量切片(Vector tile)
  6. 2018-2019 20165203 《信息安全系统设计基础》第一周学习总结
  7. FreeEIM 在盛大的开幕仪式结束之后
  8. 关于屏幕分辨率的一些操作
  9. json.stringfy()和json.parse()
  10. Heritrix 3.1.0 源码解析(三十四)
  11. python内置函数zip
  12. 性能优化,进无止境---内存篇
  13. K8S以及Kubesphere离线部署方案
  14. 东北大学计算机硬件题库,东北大学20春学期《计算机硬件技术基础》在线平时作业123答案100...
  15. 唱歌发声的基础知识与训练方法
  16. 【b站雅思笔记】Charlie有好好学习 - 雅思听力
  17. 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
  18. Android Studio发生AVD Pixel_XL_API_30 is already running报错,无手机界面问题
  19. linux的地址随机化ASLR,[翻译]Linux (x86) Exploit 开发系列教程之六(绕过ASLR - 第一部分)...
  20. 苹果手机怎么定位安卓手机_苹果手机和安卓手机不同使用感受

热门文章

  1. hibernate java内存一次能取多少条_Hibernate管理Session和批量操作分析
  2. 计算机的硬件简介,计算机基础之硬件简介(Day2)(示例代码)
  3. 怎么配置iptv服务器信息,请配置iptv服务器信息
  4. oracle数据提交不上去,oracle数据库命令窗口执行了语句但是没有提交会有什么影响吗...
  5. oracle约束应用实例,oracle 约束的novalidate 应用
  6. Genymotion设置代理至BurpSuite和Charles
  7. 《TOMCAT权威指南》摘抄
  8. 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
  9. 深入理解Spark 2.1 Core (十四):securityManager 类源码分析
  10. 深入理解Spark 2.1 Core (二):DAG调度器的原理与源码分析