software serial .available() gives inconsistent behavior

rohare:
I can only assume that this is because there is nothing in the buffer to read, but the GPS updates constantly. If I just send anything coming from the softwareSerial port directly to Serial.print it updates faster than I can read it so it doesn't make any sense that the buffer would ever be empty.

If your sketch is designed correctly it will be able to read input from the serial port massively faster than the serial port can receive it, so most of the time the receive buffer will be empty and available() will return zero. That's the normal and expected behaviour. The only way that you'd find the serial receive buffer always had something in it would be if your sketch was designed so that it didn't check for serial input very often. That would usually indicate a poor design.