在我的 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超时持续时间,并且我看不到任何其他可能的解释。