免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sqfasd
打印 上一主题 下一主题

[C++] Fiberized.IO与libevent性能对比 [复制链接]

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
11 [报告]
发表于 2015-04-30 15:19 |只看该作者
本帖最后由 yulihua49 于 2015-04-30 15:23 编辑

zai waidi  shiyong  GSM hot  ap   
hanzi buxing.

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
12 [报告]
发表于 2015-04-30 15:27 |只看该作者
回复 11# yulihua49

看你的帖子累死了,你在什么山沟里啊,连个3G/4G都没有?

论坛徽章:
0
13 [报告]
发表于 2015-04-30 16:03 |只看该作者
  1. #include <event.h>
  2. #include <event2/http.h>

  3. static void HelloHandler(struct evhttp_request* req, void* ctx) {
  4.   struct evbuffer * output_buffer = evhttp_request_get_output_buffer(req);
  5.   evbuffer_add_printf(output_buffer, "world\n");
  6.   evhttp_send_reply(req, HTTP_OK, "OK", output_buffer);
  7. }

  8. int main(int argc, char* argv[]) {
  9.   struct event_base* evbase = event_base_new();
  10.   struct evhttp* http = evhttp_new(evbase);
  11.   evhttp_set_cb(http, "/hello", HelloHandler, NULL);
  12.   evhttp_bind_socket_with_handle(http, "0.0.0.0", 12345);
  13.   event_base_dispatch(evbase);
  14. }
复制代码
  1. g++ testlibevent.cc -levent
复制代码
上午发的是在家测的,现在在公司,不方便再编译一遍Fiberized.IO,等我回家再做一下对比测试
上面是libevent的代码,你可以测试对比下,我开启了ab的-k以后,qps是可以翻倍的

论坛徽章:
0
14 [报告]
发表于 2015-04-30 16:29 |只看该作者
yulihua49 发表于 2015-04-30 11:00
shouji de hanzi youwenti

both program is C++?


-c concurrency  Number of multiple requests to make at a time

concurrency不是线程数,是并发的异步请求

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
15 [报告]
发表于 2015-04-30 16:47 |只看该作者
回复 13# sqfasd

在同一台电脑上做了测试,性能和fibio相当

  1. $ ab -k -c 100 -n 100000 127.0.0.1:12345/hello
  2. This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/

  5. Benchmarking 127.0.0.1 (be patient)
  6. Completed 10000 requests
  7. Completed 20000 requests
  8. Completed 30000 requests
  9. Completed 40000 requests
  10. Completed 50000 requests
  11. Completed 60000 requests
  12. Completed 70000 requests
  13. Completed 80000 requests
  14. Completed 90000 requests
  15. Completed 100000 requests
  16. Finished 100000 requests


  17. Server Software:        
  18. Server Hostname:        127.0.0.1
  19. Server Port:            12345

  20. Document Path:          /hello
  21. Document Length:        6 bytes

  22. Concurrency Level:      100
  23. Time taken for tests:   3.183 seconds
  24. Complete requests:      100000
  25. Failed requests:        0
  26. Keep-Alive requests:    100000
  27. Total transferred:      11300000 bytes
  28. HTML transferred:       600000 bytes
  29. Requests per second:    31417.35 [#/sec] (mean)
  30. Time per request:       3.183 [ms] (mean)
  31. Time per request:       0.032 [ms] (mean, across all concurrent requests)
  32. Transfer rate:          3466.95 [Kbytes/sec] received

  33. Connection Times (ms)
  34.               min  mean[+/-sd] median   max
  35. Connect:        0    0   0.1      0       3
  36. Processing:     1    2   0.2      2       9
  37. Waiting:        1    2   0.2      2       9
  38. Total:          1    2   0.2      2       9

  39. Percentage of the requests served within a certain time (ms)
  40.   50%      2
  41.   66%      2
  42.   75%      2
  43.   80%      2
  44.   90%      3
  45.   95%      3
  46.   98%      3
  47.   99%      3
  48. 100%      9 (longest request)
复制代码

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
16 [报告]
发表于 2015-04-30 17:02 |只看该作者
回复 13# sqfasd

其实单就性能而言,fibio-http应该会比libevent/evhttp差一点的,因为fibio-http明显多做了很多事,比如所有数据会多一次copy(天杀的C++ stream);每个连接都会新建一个fiber(内存分配);coroutine切换还是要比单纯的callback funciton要慢不少(虽然已经比thread切换块很多了)。
不过我认为付出这些代价是值得的,因为换来了线性的程序结构,换来了和标准兼容的(天杀的)C++ stream,换来了很多multi-thread环境下积累的经验和库,这些是libevent无法提供的。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
17 [报告]
发表于 2015-04-30 17:31 |只看该作者
回复 16# windoze


    是不是像golang一样舒坦

论坛徽章:
0
18 [报告]
发表于 2015-04-30 18:31 |只看该作者
windoze 发表于 2015-04-30 17:02
回复 13# sqfasd

其实单就性能而言,fibio-http应该会比libevent/evhttp差一点的,因为fibio-http明显多 ...


我看到你框架里提供了一个redis的客户端,是基于网络协议重新实现的
如果我想使用一个mongodb的客户端,是不是也得重新实现?官方提供了一个阻塞版的mongo driver,能方便的集成到协程框架吗?
我用libevent的时候,是搞了个连接池,然后通过socket pair通知到libevent事件循环中

我的意思是一般服务器很少只做本地运算,一般都要请求其他服务的,如果第三方的库不能很方便的集成到框架中,那使用起来会很麻烦。
你看响马搞的fiber.js,内置大量的第三方的客户端的库,工作量应该很大吧

对了,你测的那个Fiberized.IO的代码是多线程吗,能不能贴出来,我下班回家试试

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
19 [报告]
发表于 2015-04-30 20:32 |只看该作者
回复 18# sqfasd

测试代码就是你贴的那个,反正在我这里性能差别不明显,重复几遍测试,同是单线程的话libevent大概比fibio快个10~15%左右的样子。

fibio默认使用单个worker thread,需要增加用:
  1. fibio::this_fiber::get_scheduler().add_worker_thread(n)
复制代码
这个函数在当前fiber所属的scheduler里创建n个worker thread(fibio支持多个scheduler,每个scheduler都有自己的worker thread pool)

集成第三方库是有点烦的,大致你可以有这些做法:
1、像fibio自带的redis client一样,按照网络协议重新实现一个,这样做可以充分利用fibio的功能,但是最麻烦
2、想办法把第三方库所用的socket抽出来加入fibio的event loop,由于fibio是一个proactor风格的库,不是reactor风格,所以不能用常见的test/action事件循环,只能用boost asio里的async_*,这样十有八九你还是需要改第三方库的源代码,不过工作量应该小一些
3、用fibio里的forgien thread pool,让第三方库在单独的线程里执行,然后通过concurrent_queue与fiber通信,这样应该最简单,但是效率等方面会受些影响,印象中node.js里很多第三方库就是用类似的方法集成的。

论坛徽章:
0
20 [报告]
发表于 2015-04-30 23:41 |只看该作者
本帖最后由 sqfasd 于 2015-04-30 23:47 编辑
windoze 发表于 2015-04-30 20:32
回复 18# sqfasd

测试代码就是你贴的那个,反正在我这里性能差别不明显,重复几遍测试,同是单线程的话 ...


嗯,我现在就是用的也是第三种方法,线程池+blocking queue

我又测了下,加上-k参数后
fibio提高到15000+ qps
但是libevent到了5w+了

都是单线程, 怎么跟你测的差距那么打, 你测试的fibio是多线程吧

补充下,我是在你的官网下的压缩包,不是从github clone的,boost版本还是1.56,我看你最新的已经是1.57了,会不会是这个原因
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP