In Haskell Types make it easier for you to push dependencies upstream by leaning on the type more. We can lean on the sequence
function a little more which turns a [IO()] -> IO [()]
. The parallel-io
library has a specific function which capitalizes on this relationship called parallel
. It’s at this moment I realize that using obelisk might be a bit overkill for this example so I decided to pair down the project to be a simple Main.hs file built by the nix package manager. I used the backend.cabal file as a reference to build my new camp-notify.cabal file. This was super helpful in making the transition to a more paired down instance with nix. I basically just run nix-build release.nix
to rebuild my project and then run the executable like ./result/bin/camp-notify
. That way when I’m running the executable I can easily pass the +RTS -N4
flags to run multi-threaded.
As a benchmark I reached for the time
command line cli and passed my executable like so time ./result/bin/camp-notify
. This yielded a typical time of
./result/bin/camp-notify 1.44s user 0.09s system 15% cpu 9.704 total
After converting to parallel
and passing the correct flags we get a time of (+RTS
to indicate the start of ghc option related flags and -N
to indicate how many cores)
./result/bin/camp-notify +RTS -N4 2.43s user 0.91s system 86% cpu 3.873 total
This is 2.5 times faster! This is a dramatic improvement just by parallelizing the IOs. In the next one we will seek higher understanding by detailing the dates and reservations available per camp site.
Progress is on GitHub.