From 45f1344c132861b0afca6cb25b250722ce60ba21 Mon Sep 17 00:00:00 2001 From: "Y. T. Chung" Date: Sun, 20 Nov 2016 10:01:01 +0800 Subject: [PATCH] optimize with static allocation --- src/relay/socks5.rs | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/relay/socks5.rs b/src/relay/socks5.rs index 3b3d3556..45d39c4a 100644 --- a/src/relay/socks5.rs +++ b/src/relay/socks5.rs @@ -505,10 +505,14 @@ fn write_addr(addr: Address, w: W) -> BoxIoFuture { match addr { SocketAddr::V4(addr) => { let fut = futures::lazy(move || { - let mut buf = Vec::with_capacity(1 + 4 + 2); - buf.write_u8(SOCKS5_ADDR_TYPE_IPV4)?; // Address type - buf.write_all(&addr.ip().octets())?; // Ipv4 bytes - buf.write_u16::(addr.port())?; + let mut buf = [0u8; 1 + 4 + 2]; + { + let mut cur = Cursor::new(&mut buf[..]); + cur.write_u8(SOCKS5_ADDR_TYPE_IPV4)?; // Address type + cur.write_all(&addr.ip().octets())?; // Ipv4 bytes + cur.write_u16::(addr.port())?; + } + Ok(buf) }) .and_then(|buf| write_all(w, buf)) @@ -517,12 +521,17 @@ fn write_addr(addr: Address, w: W) -> BoxIoFuture { } SocketAddr::V6(addr) => { let fut = futures::lazy(move || { - let mut buf = Vec::with_capacity(1 + 16 + 2); - buf.write_u8(SOCKS5_ADDR_TYPE_IPV6)?; - for seg in &addr.ip().segments() { - buf.write_u16::(*seg)?; + let mut buf = [0u8; 1 + 16 + 2]; + + { + let mut cur = Cursor::new(&mut buf[..]); + cur.write_u8(SOCKS5_ADDR_TYPE_IPV6)?; + for seg in &addr.ip().segments() { + cur.write_u16::(*seg)?; + } + cur.write_u16::(addr.port())?; } - buf.write_u16::(addr.port())?; + Ok(buf) }) .and_then(|rbuf| write_all(w, rbuf))