gpt4 book ai didi

performance - 是什么让 eventlet 和 gevent 之间的性能有显着差异?

转载 作者:行者123 更新时间:2023-12-03 14:15:13 26 4
gpt4 key购买 nike

因此,这两个库具有相似的理念和相似的设计决策。但是this popular WSGI benchmarkeventletgevent 慢得多.是什么让他们的表现如此不同?

据我所知,它们之间的主要区别是:

  • gevent有意依赖并耦合到 libev ( libevent ,以前)而 eventlet定义独立的 react 器接口(interface)并使用 select 实现特定的适配器, epoll , 和它后面的 Twisted reactor。额外的 react 器接口(interface)是否会影响关键性能?
  • gevent主要用 Cython 编写,而 eventlet是用纯 Python 编写的。对于计算量不大但受 IO 限制的程序, native 编译的 Cython 是否比纯 Python 更快?
  • gevent 的原语eventlet 时模拟标准库的接口(interface)的原语与标准不同,并提供了额外的层来模拟它。额外的仿真层是否使eventlet慢点?
  • 是执行eventlet.wsgigevent.pywsgi 差一点?

  • 我真的很想知道,因为它们对我来说总体上看起来很相似。

    最佳答案

    好吧,gevent 不是“主要”用 Cython 编写的,尽管一些关键部分是。

    Cython 有很大的不同。处理器优化在编译代码上效果更好。例如,分支预测在基于 VM 的系统中分崩离析,因为在 VM 执行级别的分支的间接性对它是不透明的。缓存占用空间更小。编译后的代码在这里有很大的不同,IO 对延迟非常敏感。

    同样,libev 也非常快。同样的原因。

    似乎 eventlet 不应该使用选择集线器(Python 2.6 通常默认为 epoll)。但是,如果它卡在 select 上,那将使它变得非常慢(因为 Python 必须将 select fd_set 来回转换为 Python 列表,因此当它处于循环中间时会变得很难看)。

    我没有进行任何分析,但我愿意打赌 libev/libevent 加上 Cython 会产生很大的不同。值得注意的是,一些线程原语在 Cython in gevent 中。这很重要,因为很多代码通过 IO 间接接触它们,甚至在某些地方甚至是标准库。

    至于 eventlet 的附加仿真层,似乎确实有更多的弹性。在 gevent 中,代码路径似乎构造了回调并让集线器调用它们。 eventlet 似乎完成了集线器在 gevent 中所做的更多簿记工作。不过,我还没有对它进行分析。至于猴子补丁本身,它们看起来非常相似。

    WSGI 服务器是另一个困难的服务器。值得注意的是,gevent 中的 header 解析被推迟到标准库中,而他们自己在 eventlet 中实现它。不确定这是否是一个很大的影响,但如果有什么潜伏在那里也就不足为奇了。最能说明问题的是 eventlet 的服务器是基于标准库 BaseHTTPServer 的猴子补丁版本。我无法想象这是非常理想的。 Gevent 实现了一个知道仿真的服务器。

    关于performance - 是什么让 eventlet 和 gevent 之间的性能有显着差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669971/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com