在我的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"))
我的haskell代码出错了吗? simpleHTTP
的高效替代品是什么?
答案 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超时持续时间,并且没有我可以看到的任何其他可能的解释。