“多线程IO”和“单线程异步IO”的对比
来源:互联网 发布:淘宝店铺权重是什么 编辑:程序博客网 时间:2024/06/09 14:31
顺手写了个程序对比了一下多线程IO和单线程异步IO的性能差异。需要说明的是,Linux上目前的异步IO是由用户态线程模拟的。目前内核原生的AIO和glibc中的异步IO都有缺陷,libeio目前感觉比较好(因为nodejs在用)。单线程异步IO指的是主线程中控制IO的代码全部都是在主线程中执行的,libeio内部使用的线程对外来说完全不可感知。单线程异步IO的好处就是主流程中的控制代码完全处于单线程环境,可以完全不用考虑锁的问题。
应用场景客户端启动20个线程同时从服务端求数据。服务端从磁盘出文件回给客户端。服务端有两种实现1、使用多线程每个线程服务一个用户。2、使用单线程和异步IO来服务多个用户。
测试时服务端的处理器为单核600MHZ的ArmV6(RaspberryPi),客户端为2.5 GHz Intel Core i5(2013版 Mac mini),因此客户端不会成为性瓶可以体现出服务端的差异。两台机器用100M网线直连。
20个线程下载700KB的文件:(测4次录每次成绩,数据为所花费的时间,越少越好)
多线程
183393
183505
183792
182878
异步IO
198165
191537
196565
193653
20个线程下载40K文件
多线程
12434
13099
12773
12958
异步IO
15293
15073
15974
15631
两种方案的优缺点对比
1、性上传统的多线程方案占有优势。不过测程序中多线程中完全没有使用锁,现实中由于的锁的限制多线程的性将大打折扣。
2、单线程异步IO程序中,由于控制代码在单线程环境中运行,可以完全无锁。
3、单线程异步IO程序中同时服务20个用户只使用了3个线程(libeio使用线程模拟异步IO,当前linux上异步IO没有更好的决方案),多线程版本的程序使用了21个线程(包括主线程)。由于线程多,因此多线程版本的内存占用比libeio版本了很多。
4、libieo版本的流程没有多线程版本的直观。
总结
单线程异步IO的主流程代码可以完全无锁,这个是单线程异步IO的最大优势。在性能损失不多的情况下(和完全无锁的多线程方案对比,现实中完全无锁的多线程环境几乎不存在),很值得考虑。唯一需要考虑的,单线程异步IO可能对多核CPU的利用不如传统的多线程充分。
另外,还可以扩展一下,在编写复杂应用时,除了IO等阻塞操作,CPU密集的操作也可以拿出来到单独的线程中执行,尽量把耗时不多的逻辑部分留在单线程中,由于运行在单线程环境,这样很大程度上简化逻辑部分的编写。
转自:http://www.grati.org/?p=684
- “多线程IO”和“单线程异步IO”的对比
- “多线程IO”和“单线程异步IO”的对比
- “多线程IO”和“单线程异步IO”的对比【转】
- “多线程IO”和“单线程异步IO”的对比
- 单线程、事件循环和异步IO
- eventlet引发的学习-python:单线程、多线程在IO两方面的性能对比
- 网络IO模型解析:同步IO和异步IO,阻塞IO和非阻塞IO的对比分析
- 网络IO模型解析:同步IO和异步IO,阻塞IO和非阻塞IO的对比分析
- Nodejs的单线程、异步IO与事件驱动
- 多线程同步与单线程异步对比
- 多线程同步与单线程异步对比
- 线程池+同步io和异步io(浅谈)
- 同步IO和异步IO
- 同步IO和异步IO
- 同步IO和异步IO
- 同步IO和异步IO
- 同步IO和异步IO
- 同步IO和异步IO
- keyup,keydown事件在IOS上无效问题
- win7 64bit下安装Anaconda3-4.4.0-Windows-x86_64报错failed to create anacoda menu
- 河北丰宁洪汤寺隧道打响进洞施工第一炮
- phpStrom连接MySQL数据库
- windows下用anaconda安装tensorflow的步骤
- “多线程IO”和“单线程异步IO”的对比
- UVA 1600-- Patrol Robot (bfs)
- git reset revert 回退回滚取消提交返回上一版本
- 内容提供者
- 关于Launcher原生apk的卸载安装监听
- 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
- Linux学习——基础命令、搜索命令、压缩解压命令
- 贪吃蛇
- CentOS7.2 上安装 Docker 教程