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