I found that in pgJDBC, calling prepareStatement retrieves metadata before executing the SQL.
This behavior disables binary transfer, which forces subsequent queries to fall back to string-based transfer and requires an extra sendParse execution.
I have already fixed this issue in pgJDBC.
Upgrading to a newer version of pgJDBC will allow us to benefit from this fix and improve prepared statement performance.
see pgjdbc/pgjdbc#3783