You mentioned that Cloud Run allowed you to reserve a number of always-running instances, but that feature is available for Cloud Functions as well [0].
[0] https://cloud.google.com/functions/docs/configuring/min-inst...
[0] https://cloud.google.com/functions/docs/configuring/min-inst...
Functions still only run a single request at a time, while Cloud Run can run as many as the container can handle. We want to build for multiple smaller requests, so when we get ~10k requests incoming in a short timespan it's a lot more useful to have Cloud Run.
I may be mistaken, but I believe cold start is roughly the same for both.
Do you have any idea of where your performance gains are coming from? Is there a lot of async, non-blocking waiting happening in the process of fulfilling requests against your API?
I believe the majority of our performance gain is from having far fewer cold starts during large traffic loads.