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

Haskell simpleHTTP of Network.HTTP.Conduit performing slowly for get requests

在我的 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 替代方法使用 Net::HTTP.get(URI.parse("https://github.com/trending?l=ruby"))

调用 100 api 只需要 153 秒

我的 haskell 代码有问题吗? simpleHTTP 的高性能和高效替代方案是什么?

The documentation for simpleHttp 说:

Note: This function creates a new Manager. It should be avoided in production code.

您的代码为每个请求创建一个新的管理器。如果您将其更改为重用单个管理器,它可能会快得多。您可以使用 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 超时持续时间,我没有看到任何其他可能的解释。