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別の方法では、100 回の API 呼び出しに 153 秒しかかかりません。Net::HTTP.get(URI.parse("https://github.com/trending?l=ruby"))

Haskell コードで何か間違ったことをしていますか? の高性能で効率的な代替手段はsimpleHTTP何ですか?

4

2 に答える 2

1

のドキュメントにsimpleHttpは次のように書かれています:

注: この関数は、新しいマネージャーを作成します。プロダクションコードでは避けるべきです。

コードは、リクエストごとに新しいマネージャーを作成します。単一のマネージャーを再利用するように変更すると、はるかに高速になる可能性があります。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 ライブラリは、IPv4 にフォールバックする前にタイムアウトになる IPv6 DNS リクエストのようなことを行っており、Go と Ruby は IPv4 リクエストを直接行っていると思われます。リクエストごとに数秒というのは、おそらく DNS タイムアウト期間であり、他に考えられる説明はありません。

于 2015-04-21T21:47:34.330 に答える