Hi Alan, > What cheap is VerifyVersionInfoW? The check is done everytime but the > overhead might be in the noise. Overall it looks good to me.
I wrote a small benchmark to measure the overhead of the version check (attached below). On my SurfaceBook 2 running Windows 10 Build 19041, the version check measures about ~2.2us (micro seconds) on average, when the version matches. Elapsed time 2244us. (for 1,000 iterations) On a Windows 2016 Data Center Server the version check is much smaller ~0.13us (micro seconds) on average, when the version doesn't match. Elapsed time 128us. (for 1,000 iterations) I think the overhead is reasonably small compared to everything else. Please let me know if it's acceptable and if we can proceed. Thanks, Nikola Benchmark program: int main() { LARGE_INTEGER start_time, end_time, elapsed_us; LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); QueryPerformanceCounter(&start_time); int count = 0; for (int i = 0; i < 1000; i++) { count += IsWindows10RS3OrGreater(); } QueryPerformanceCounter(&end_time); elapsed_us.QuadPart = end_time.QuadPart - start_time.QuadPart; elapsed_us.QuadPart *= 1000000; elapsed_us.QuadPart /= frequency.QuadPart; printf("Elapsed time %lldus.\n", elapsed_us.QuadPart); } -----Original Message----- From: Alan Bateman <alan.bate...@oracle.com> Sent: July 31, 2020 1:29 PM To: Nikola Grcevski <nikola.grcev...@microsoft.com>; net-dev@openjdk.java.net Subject: Re: RFR(s): Improving performance of Windows socket connect on the loopback adapter On 28/07/2020 15:03, Nikola Grcevski wrote: > Hi Alan, > > Thanks again for testing this change. I dug deep into the issue yesterday and > got some answers from the Windows Networking team. > > The issue is that the flag TCP_INITIAL_RTO_NO_SYN_RETRANSMISSIONS, which we > passed in to completely eliminate the network delay, isn't defined (or > checked) on Windows 10 versions prior to RS3 (Redstone 3). The flag was > interpreted as TCP_INITIAL_RTO_DEFAULT_MAX_SYN_RETRANSMISSIONS, causing a > retry of 255 times, each one taking 500ms. This made each individual connect > delay take 128 seconds in total. > > I was advised to change the code to perform a runtime check on the exact > Windows version and unless it's Windows 10RS3 or later, we should set the > retransmissions to 1. Strangely enough, we can't set it to 0, which is a > special value interpreted as use the default. With retransmission count of 1, > we speed up the localhost connects on older versions of Windows by factor of > 2. > > I have prepared a new webrev with the runtime check for review here: > http://cr.openjdk.java.net/~adityam/nikola/fast_connect_loopback_4/ > > For the Windows version check function I followed the naming standards the > SDK uses in: > https://docs.microsoft.com/en-us/windows/win32/api/versionhelpers/ > > If it's not a suitable function name please let me know. They have added this > helper function for .NET 4.8 but it's not there yet for Win32. Hopefully, it > comes provided by Microsoft in a future SDK update and we can remove the > helper. I attempted to use IsWindowsVersionOrGreater, but unfortunately that > API doesn't allow me to specify the build number to detect RS3. > What cheap is VerifyVersionInfoW? The check is done everytime but the overhead might be in the noise. Overall it looks good to me. -Alan