Only update peak costs on the first parse pass
On the second parse pass we can reuse the initial data. This saves ~200ms of parse time in my test case, and brings the time down to ~1.6s from 1.8s.