This might simply be an artifact of the fact that the test is small, and isolated.
When there is no traffic to a function, there will be 0 instances of it running. When a sudden influx of traffic is received, the underlying infrastructure will be signaled to start, but this startup is not instant. The pending messages will be queued until there is enough infrastructure to serve them all. Under circumstances when the load is "stable", then you might see the first few messages processed sequentially but over some period of time the throughput should increase up to some maximum concurrency as additional function instances become available.
In this case because there are no subsequent messages (i.e. we go from 0 to 100 to 0 again), then you never see this throughput stabilization. Concretely, a sustained QPS should achieve max concurrency independent of the channel (pubsub or otherwise). Although perhaps not obvious, this behavior works fine for most use cases. That said, for some class of batch processing use cases, where it's likely that there will be a short burst of many messages going from 0-N-0 quickly, then things should probably behave differently. We're looking into what we can do for these cases, but if you're really just testing to see how it behaves, then hopefully this explanation helps somewhat.
Cheers,
Jason.