This adds perceivable overhead to the connect process, which we really don't want on a background thread. It is especially noticeable when discord is not running and the reconnect process is constantly running in the background.
To get around this, we can request a connect timeout of 0 ms from the underlying API. Checking the implementations, this seems like a valid method, as long as there is external retry logic in place (which there is in the local class).
Over 5 failed connection attempts:
Before
After
Note that this profiled view is considering thread running time, not all time. It does not include actual Thread.Sleep sleep time, and the overhead seen here is actual CPU time being used from spinlocking.
The implementation of
NamedPipeClientStream
has some egregious use ofSpinOnce
:https://github.com/dotnet/runtime/blob/d59af2cf097acb100ad6a9cba652be34be6f4a2e/src/libraries/System.IO.Pipes/src/System/IO/Pipes/NamedPipeClientStream.cs#L151-L155
This adds perceivable overhead to the connect process, which we really don't want on a background thread. It is especially noticeable when discord is not running and the reconnect process is constantly running in the background.
To get around this, we can request a connect timeout of 0 ms from the underlying API. Checking the implementations, this seems like a valid method, as long as there is external retry logic in place (which there is in the local class).
Over 5 failed connection attempts:
Note that this profiled view is considering thread running time, not all time. It does not include actual
Thread.Sleep
sleep time, and the overhead seen here is actual CPU time being used from spinlocking.Tested on Windows, macOS and linux.