在 @gen.coroutine、@asyncio.coroutine 和异步之间,哪个 pyzmq 实现具有最快的吞吐量?
Which pyzmq implementation has the fastest throughput between @gen.coroutine, @asyncio.coroutine and async?
目前在 pzmq 中有多种方法可以实现文档中提到的异步 IO 循环。
http://pyzmq.readthedocs.io/en/latest/api/index.html
从纯粹的性能角度来看,文档中并不清楚这些选择是否等效。它们是:
- 龙卷风@gen.coroutine
- 原生@asyncio.coroutine
- 龙卷风异步
那么,在文档示例中所示的典型 PUSH-PULL 场景中,哪个每秒消息吞吐量最高?为什么我们看到它们之间的区别?
结果
与我的预期相反,pyzmq 中的两个 asyncio 实现似乎都比 "legacy" tornado 慢。
龙卷风@gen.coroutine:
Avg. Speed: 2160.26 msg/s
本地@asyncio.coroutine:
Avg. Speed: 1697.66 msg/s
龙卷风异步:
Avg. Speed: 1695.29 msg/s
此外,这两个 asyncio 实现时不时地显示高达 3536.27 msg/s 的爆发,而 Tornado @gen.coroutine 的吞吐量非常稳定。
测试代码
为了进行比较,我使用了修改后的版本:
龙卷风@gen.coroutine:
https://github.com/zeromq/pyzmq/blob/master/examples/eventloop/coroutines.py
原生@asyncio.coroutine:
https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/coroutines.py
Tornado 异步:(Python 仅限 3.5+;包括额外的打印协程)
https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/tornado_asyncio.py
修改包括每 5 秒显示每秒平均消息数而不是点。在 PULL 协程中,我递增 n = n + 1
然后在打印协程中我计算 v = n / (time.time() - start)
并显示它。此外,我每 10,000 条消息重置 n = 0
和 start = time.time()
以防止测量中的任何偏移效应。
环境
$ uname -a
Linux localhost 4.6.3-300.fc24.x86_64 #1 SMP Fri Jun 24 20:52:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ python3 --version
Python 3.5.1
>>> zmq.__version__
'15.3.0'
>>> tornado.version
'4.3'
目前在 pzmq 中有多种方法可以实现文档中提到的异步 IO 循环。 http://pyzmq.readthedocs.io/en/latest/api/index.html
从纯粹的性能角度来看,文档中并不清楚这些选择是否等效。它们是:
- 龙卷风@gen.coroutine
- 原生@asyncio.coroutine
- 龙卷风异步
那么,在文档示例中所示的典型 PUSH-PULL 场景中,哪个每秒消息吞吐量最高?为什么我们看到它们之间的区别?
结果
与我的预期相反,pyzmq 中的两个 asyncio 实现似乎都比 "legacy" tornado 慢。
龙卷风@gen.coroutine:
Avg. Speed: 2160.26 msg/s
本地@asyncio.coroutine:
Avg. Speed: 1697.66 msg/s
龙卷风异步:
Avg. Speed: 1695.29 msg/s
此外,这两个 asyncio 实现时不时地显示高达 3536.27 msg/s 的爆发,而 Tornado @gen.coroutine 的吞吐量非常稳定。
测试代码
为了进行比较,我使用了修改后的版本:
龙卷风@gen.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/eventloop/coroutines.py
原生@asyncio.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/coroutines.py
Tornado 异步:(Python 仅限 3.5+;包括额外的打印协程) https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/tornado_asyncio.py
修改包括每 5 秒显示每秒平均消息数而不是点。在 PULL 协程中,我递增 n = n + 1
然后在打印协程中我计算 v = n / (time.time() - start)
并显示它。此外,我每 10,000 条消息重置 n = 0
和 start = time.time()
以防止测量中的任何偏移效应。
环境
$ uname -a
Linux localhost 4.6.3-300.fc24.x86_64 #1 SMP Fri Jun 24 20:52:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
$ python3 --version
Python 3.5.1
>>> zmq.__version__
'15.3.0'
>>> tornado.version
'4.3'