To maximise throughput for a single data flow, you certainly do need to get a big enough window size. I've done this a few rimes in the past. For example, you have an app that gathers data continuously at node A and needs to send close to 4Mbits/second on a 4Mbps link across the world to node B. The round-trip latency is usually 300ms, but often up to 500ms. So TCP has to be willing to send up to 500ms of data before it receives an ACK for even the first packet.
At 4 Mbits/second that is 2 Mbits = 250,000 bytes of data. So the window size needs to be about 250KBytes.
When it starts, node A will dump 250KBytes of data in packets directly across the local LAN onto its gateway router. The gateway router will send this down the 4Mbps link over the next 500ms. ACKs will start coming back and node A will then send more packets as ACKs arrive.
If you make the window size too small, then the flow will stop for a bit waiting for ACKs to come back - wasted time on the link.
If you make the window size too big, then your local gateway might not appreciate the initial dumping of data into its buffers, and drop some of it!
Sorry - I didn't answer your question! The different TCP implementations will do different things by default, someone else will know what that is on FreeBSD, Linux, Windows etc.