Skip to content

Commit 19d53b2

Browse files
committed
optimizations on update_ack, using shift operators
1 parent 7a0caae commit 19d53b2

File tree

1 file changed

+8
-12
lines changed

1 file changed

+8
-12
lines changed

kcp.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ type KCP struct {
127127
conv, mtu, mss, state uint32
128128
snd_una, snd_nxt, rcv_nxt uint32
129129
ssthresh uint32
130-
rx_rttvar, rx_srtt, rx_rto, rx_minrto uint32
130+
rx_rttvar, rx_srtt int32
131+
rx_rto, rx_minrto uint32
131132
snd_wnd, rcv_wnd, rmt_wnd, cwnd, probe uint32
132133
interval, ts_flush, xmit uint32
133134
nodelay, updated uint32
@@ -340,29 +341,24 @@ func (kcp *KCP) update_ack(rtt int32) {
340341
// https://tools.ietf.org/html/rfc6298
341342
var rto uint32
342343
if kcp.rx_srtt == 0 {
343-
kcp.rx_srtt = uint32(rtt)
344-
kcp.rx_rttvar = uint32(rtt) >> 1
344+
kcp.rx_srtt = rtt
345+
kcp.rx_rttvar = rtt >> 1
345346
} else {
346347
delta := rtt - int32(kcp.rx_srtt)
348+
kcp.rx_srtt += delta >> 3
347349
if delta < 0 {
348350
delta = -delta
349351
}
350-
351-
kcp.rx_srtt = (7*kcp.rx_srtt + uint32(rtt)) >> 3
352-
if kcp.rx_srtt < 1 {
353-
kcp.rx_srtt = 1
354-
}
355-
356352
if rtt < int32(kcp.rx_srtt-kcp.rx_rttvar) {
357353
// if the new RTT sample is below the bottom of the range of
358354
// what an RTT measurement is expected to be.
359355
// give an 8x reduced weight versus its normal weighting
360-
kcp.rx_rttvar = (31*kcp.rx_rttvar + uint32(delta)) >> 5
356+
kcp.rx_rttvar += (delta - kcp.rx_rttvar) >> 5
361357
} else {
362-
kcp.rx_rttvar = (3*kcp.rx_rttvar + uint32(delta)) >> 2
358+
kcp.rx_rttvar += (delta - kcp.rx_rttvar) >> 2
363359
}
364360
}
365-
rto = kcp.rx_srtt + _imax_(kcp.interval, 4*kcp.rx_rttvar)
361+
rto = uint32(kcp.rx_srtt) + _imax_(kcp.interval, uint32(kcp.rx_rttvar)<<2)
366362
kcp.rx_rto = _ibound_(kcp.rx_minrto, rto, IKCP_RTO_MAX)
367363
}
368364

0 commit comments

Comments
 (0)