My guess is that since you ran `rg` first, the file wasn't in memory, and you ended up benchmarking disk IO. (Notice the sys time decrease from your first run to the second run.) Subsequent commands then run faster with the file already in memory.
This is one of many reasons why assembling the benchmarks in my blog post was so difficult. For example, on every command I benchmarked, I ran them 3 times for "warmup" and didn't record any measurements. I then ran them another 10 times in which I recorded them. You can see the raw output here: https://github.com/BurntSushi/ripgrep/blob/master/benchsuite...
In any case, on my underpowered Mac, here are some results on a 1.2 GB file (notice how much the time fluctuates until its fully in cache):
mac:~ andrew$ ggrep --version
ggrep (GNU grep) 2.25
Packaged by Homebrew
mac:~ andrew$ time ggrep 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m5.447s
user 0m0.600s
sys 0m0.350s
mac:~ andrew$ time ggrep 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m1.247s
user 0m0.549s
sys 0m0.264s
mac:~ andrew$ time ggrep 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m0.803s
user 0m0.542s
sys 0m0.259s
mac:~ andrew$ time ggrep 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m0.805s
user 0m0.544s
sys 0m0.260s
And now for rg:
mac:~ andrew$ time rg 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m1.062s
user 0m0.339s
sys 0m0.333s
mac:~ andrew$ time rg 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m0.640s
user 0m0.337s
sys 0m0.302s
mac:~ andrew$ time rg 'Bruce Springsteen' foo.jsonl > /dev/null
real 0m0.637s
user 0m0.336s
sys 0m0.300s
Oh! And check this out, on a Mac, not using a memory map for single files is faster. My goodness---memory map performance is all over the place.
mac:~ andrew$ time rg 'Bruce Springsteen' foo.jsonl --no-mmap > /dev/null
real 0m0.445s
user 0m0.170s
sys 0m0.274s
If I do this on my Linux machine on the same file, I get timings of 0.275s for rg, 0.398s for rg with no memory maps (opposite direction for Mac) and 0.708s for GNU grep (v 2.25).
Benchmarks are fun, eh?