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

时间:2015-04-21 16:49:54

标签: http haskell https http-conduit network-conduit

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

进行100次api通话只需要153秒

我的haskell代码出错了吗? simpleHTTP的高效替代品是什么?

2 个答案:

答案 0 :(得分:1)

The documentation for 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 ()

答案 1 :(得分:1)

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