1

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

import Network.HTTP.Conduit

在我的主要功能中,我GET使用simpleHTTP

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

4

2 回答 2

1

的文档simpleHttp说:

注意:此函数创建一个新的 Manager。在生产代码中应该避免它。

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

import Network.HTTP.Conduit
main = do
    request <- parseUrl "https://github.com/trending?l=ruby"
    manager <- newManager conduitManagerSettings
    _response <- httpLbs request manager
    return ()
于 2015-04-21T19:19:10.740 回答
1

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

于 2015-04-21T21:47:34.330 回答