Haskell simpleHTTP of Network.HTTP.Conduit 对于 get 请求执行缓慢



在我的 haskell 代码中,我已将Network.HTTP.Conduit导入

import Network.HTTP.Conduit

在我的主函数中,我使用 simpleHTTP 发出一个简单的GET请求

main = do
     response <- simpleHttp "https://github.com/trending?l=ruby"
     return ()

完成 100 个 api 请求需要 6 分 42 秒

time for NUM in `seq 1 1 100`; do ./Testhttp; done
real    6m42.839s
user    0m12.115s
sys 0m2.652s

ruby替代方案只需 153 秒即可进行 100 次 API 调用

,使用 Net::HTTP.get(URI.parse("https://github.com/trending?l=ruby"))

我在 haskell 代码中做错了什么吗?什么是simpleHTTP的性能和高效替代方案?

simpleHttp的文档说:

注: 此函数创建一个新的管理器。在生产代码中应避免使用。

您的代码为每个请求创建一个新管理器。如果将其更改为重用单个管理器,则可能会快得多。您可以使用newManager创建经理。例如:

import Network.HTTP.Conduit
main = do
    request <- parseUrl "https://github.com/trending?l=ruby"
    manager <- newManager conduitManagerSettings
    _response <- httpLbs request manager
    return ()

我的猜测是,你正在使用的Haskell库正在执行类似IPv6 DNS请求的事情,该请求在回退到IPv4之前超时,而Go和Ruby正在直接执行IPv4请求。每个请求的几秒钟可能是DNS超时持续时间,并且我看不到任何其他可能的解释。

相关内容

  • 没有找到相关文章

最新更新