I use the following settings, basically the default:
- Mailer batch limit: 0
- Mailer job size: 0
- Mailer throttle time: 0
- Database Update Frequency: 10
I use a long-running cron, so it's really just one process running at 100% while sending emails. I don't want to impact too much the rest of the CRM, so I only run one thread/job at the time.
One easy tweak would be to increase the database update frequency to 20. This setting has some risk. If sending emails fails for some reason, and CiviMail tries to re-send those emails at every cron run, then there is a risk of emailing those users repeatedly (well, lets say it delivered 9 emails, but failed on the 10th, the first 9 will be resent again and again).
For Sparkpost, I had found that using the Sparkpost PHP library to send emails was 20-30% faster, compared to what the Sparkpost extension is doing. To be honest, I have not measured it recently, and presumably it also ends up doing "curl" calls, so I would rather not create high expectations. We maintain a fork here, that uses the PHP library: https://civicrm.org/extensions/sparkpost-symbiotic
One of the issues with CiviMail, is that we end up doing an HTTP POST query to Sparkpost for each email. Ideally, we would batch those, and send a few emails at the time (or even, use the Sparkpost templating features, and just upload a list of contacts into a Stored Recipient List, but that would break tokens, add more configurations, and increase lock-in).
Finally, keep in mind that Sparkpost might also throttle delivery on their end, to avoid sending too many emails to the same provider at the same time (which might trigger their anti-spam).