wreq はデフォルトで http-client-tls を使ってSSL通信するのだけど、これが結構遅くてビビった1。
そこで、 tls パッケージではなく OpenSSL の Haskell バインディングである HsOpenSSL に差し替えてみたら、手元で 40 秒かかっていたバッチの実行時間が 30 秒まで短くなった。 25% の改善。
差し替えるには、 HsOpenSSL
パッケージと http-client-openssl
パッケージへの依存を *.cabal
へ追加して、
import qualified Network.Wreq as Wreq
main :: IO ()
main = do
res <- Wreq.get uri
...
的な部分を、
import Control.Lens ((&), (.~))
import qualified Network.HTTP.Client.OpenSSL as COpenSSL
import qualified Network.Wreq as Wreq
import qualified OpenSSL
import OpenSSL.Session (context)
opts :: Wreq.Options
opts = Wreq.defaults
& Wreq.manager .~ Left (COpenSSL.opensslManagerSettings context)
main :: IO ()
main = OpenSSL.withOpenSSL $ do
res <- Wreq.getWith opts uri
...
としてやるとよい。ってことは、 wreqのドキュメント にさらっと書いてあった。
-
プロファイルしてみた感じ Data.ByteString.Base64 周りで時間喰ってそう ↩