Find fastest possible read time for fakeNonblockingReadWaitDuration
The first 5 fake non-blocking reads are limited to 1 byte. This should ensure that there is a measurement of a read where bytes are already waiting in Go or the OS's read buffer.
This commit is contained in:
@@ -91,6 +91,7 @@ type NetConn struct {
|
|||||||
readDeadlineLock sync.Mutex
|
readDeadlineLock sync.Mutex
|
||||||
readDeadline time.Time
|
readDeadline time.Time
|
||||||
readNonblocking bool
|
readNonblocking bool
|
||||||
|
fakeNonBlockingShortReadCount int
|
||||||
fakeNonblockingReadWaitDuration time.Duration
|
fakeNonblockingReadWaitDuration time.Duration
|
||||||
|
|
||||||
writeDeadlineLock sync.Mutex
|
writeDeadlineLock sync.Mutex
|
||||||
@@ -416,6 +417,13 @@ func (c *NetConn) fakeNonblockingRead(b []byte) (n int, err error) {
|
|||||||
c.readDeadlineLock.Lock()
|
c.readDeadlineLock.Lock()
|
||||||
defer c.readDeadlineLock.Unlock()
|
defer c.readDeadlineLock.Unlock()
|
||||||
|
|
||||||
|
// The first 5 reads only read 1 byte at a time. This should give us 4 chances to read when we are sure the bytes are
|
||||||
|
// already in Go or the OS's receive buffer.
|
||||||
|
if c.fakeNonBlockingShortReadCount < 5 && len(b) > 0 {
|
||||||
|
b = b[:1]
|
||||||
|
c.fakeNonBlockingShortReadCount++
|
||||||
|
}
|
||||||
|
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
deadline := startTime.Add(c.fakeNonblockingReadWaitDuration)
|
deadline := startTime.Add(c.fakeNonblockingReadWaitDuration)
|
||||||
if c.readDeadline.IsZero() || deadline.Before(c.readDeadline) {
|
if c.readDeadline.IsZero() || deadline.Before(c.readDeadline) {
|
||||||
|
|||||||
Reference in New Issue
Block a user