• Ian Davis's avatar
    net/url: remove an allocation for short strings in escape · 95a11c73
    Ian Davis authored
    Use a 64 byte array to avoid an allocation on the assumption that
    most url escaping is performed on short strings. Also adds a fast
    path for escaping strings whose only replacements are spaces which
    is common in query components.
    
    Adds benchmarks for QueryEscape, PathEscape, QueryUnescape and
    PathUnescape but no optimizations are include for the unescape functions
    so I don't include those benchmark results here.
    
    Reduces allocations by 10% in the existing String benchmark with a
    modest performance increase.
    
    name               old time/op    new time/op    delta
    QueryEscape/#00-8    64.6ns ± 1%    43.8ns ± 0%  -32.14%  (p=0.000 n=9+9)
    QueryEscape/#01-8     276ns ± 3%     249ns ± 0%   -9.62%  (p=0.000 n=10+7)
    QueryEscape/#02-8     176ns ± 2%     155ns ± 3%  -12.21%  (p=0.000 n=10+10)
    QueryEscape/#03-8     388ns ± 1%     362ns ± 0%   -6.55%  (p=0.000 n=10+8)
    QueryEscape/#04-8    2.32µs ± 2%    2.27µs ± 2%   -2.26%  (p=0.001 n=10+10)
    PathEscape/#00-8     78.0ns ± 3%    63.4ns ± 1%  -18.69%  (p=0.000 n=10+10)
    PathEscape/#01-8      276ns ± 2%     260ns ± 0%   -6.01%  (p=0.000 n=10+10)
    PathEscape/#02-8      175ns ± 0%     153ns ± 0%  -12.53%  (p=0.000 n=8+10)
    PathEscape/#03-8      389ns ± 2%     361ns ± 0%   -7.21%  (p=0.000 n=10+9)
    PathEscape/#04-8     2.30µs ± 2%    2.27µs ± 1%   -1.33%  (p=0.001 n=9+10)
    String-8             3.56µs ± 4%    3.42µs ± 7%   -4.00%  (p=0.003 n=10+10)
    
    name               old alloc/op   new alloc/op   delta
    QueryEscape/#00-8     16.0B ± 0%      8.0B ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#01-8      128B ± 0%       64B ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#02-8     64.0B ± 0%     32.0B ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#03-8      128B ± 0%       64B ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#04-8      832B ± 0%      832B ± 0%     ~     (all equal)
    PathEscape/#00-8      32.0B ± 0%     16.0B ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#01-8       128B ± 0%       64B ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#02-8      64.0B ± 0%     32.0B ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#03-8       128B ± 0%       64B ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#04-8       704B ± 0%      704B ± 0%     ~     (all equal)
    String-8             1.84kB ± 0%    1.66kB ± 0%   -9.57%  (p=0.000 n=10+10)
    
    name               old allocs/op  new allocs/op  delta
    QueryEscape/#00-8      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#01-8      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#02-8      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#03-8      2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    QueryEscape/#04-8      2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    PathEscape/#00-8       2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#01-8       2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#02-8       2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#03-8       2.00 ± 0%      1.00 ± 0%  -50.00%  (p=0.000 n=10+10)
    PathEscape/#04-8       2.00 ± 0%      2.00 ± 0%     ~     (all equal)
    String-8               69.0 ± 0%      61.0 ± 0%  -11.59%  (p=0.000 n=10+10)
    
    Updates #17860
    
    Change-Id: I45c5e9d40b242f874c61f6ccc73bf94c494bb868
    Reviewed-on: https://go-review.googlesource.com/134296
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    95a11c73
Name
Last commit
Last update
..
http Loading commit data...
internal/socktest Loading commit data...
mail Loading commit data...
rpc Loading commit data...
smtp Loading commit data...
testdata Loading commit data...
textproto Loading commit data...
url Loading commit data...
addrselect.go Loading commit data...
addrselect_test.go Loading commit data...
cgo_android.go Loading commit data...
cgo_bsd.go Loading commit data...
cgo_linux.go Loading commit data...
cgo_netbsd.go Loading commit data...
cgo_openbsd.go Loading commit data...
cgo_resnew.go Loading commit data...
cgo_resold.go Loading commit data...
cgo_socknew.go Loading commit data...
cgo_sockold.go Loading commit data...
cgo_solaris.go Loading commit data...
cgo_stub.go Loading commit data...
cgo_unix.go Loading commit data...
cgo_unix_test.go Loading commit data...
cgo_windows.go Loading commit data...
conf.go Loading commit data...
conf_netcgo.go Loading commit data...
conf_test.go Loading commit data...
conn_test.go Loading commit data...
dial.go Loading commit data...
dial_test.go Loading commit data...
dial_unix_test.go Loading commit data...
dnsclient.go Loading commit data...
dnsclient_test.go Loading commit data...
dnsclient_unix.go Loading commit data...
dnsclient_unix_test.go Loading commit data...
dnsconfig_unix.go Loading commit data...
dnsconfig_unix_test.go Loading commit data...
dnsname_test.go Loading commit data...
error_nacl.go Loading commit data...
error_plan9.go Loading commit data...
error_plan9_test.go Loading commit data...
error_posix.go Loading commit data...
error_posix_test.go Loading commit data...
error_test.go Loading commit data...
error_unix.go Loading commit data...
error_unix_test.go Loading commit data...
error_windows.go Loading commit data...
error_windows_test.go Loading commit data...
example_test.go Loading commit data...
external_test.go Loading commit data...
fd_plan9.go Loading commit data...
fd_unix.go Loading commit data...
fd_windows.go Loading commit data...
file.go Loading commit data...
file_plan9.go Loading commit data...
file_stub.go Loading commit data...
file_test.go Loading commit data...
file_unix.go Loading commit data...
file_windows.go Loading commit data...
hook.go Loading commit data...
hook_plan9.go Loading commit data...
hook_unix.go Loading commit data...
hook_windows.go Loading commit data...
hosts.go Loading commit data...
hosts_test.go Loading commit data...
interface.go Loading commit data...
interface_bsd.go Loading commit data...
interface_bsd_test.go Loading commit data...
interface_bsdvar.go Loading commit data...
interface_darwin.go Loading commit data...
interface_freebsd.go Loading commit data...
interface_linux.go Loading commit data...
interface_linux_test.go Loading commit data...
interface_plan9.go Loading commit data...
interface_solaris.go Loading commit data...
interface_stub.go Loading commit data...
interface_test.go Loading commit data...
interface_unix_test.go Loading commit data...
interface_windows.go Loading commit data...
ip.go Loading commit data...
ip_test.go Loading commit data...
iprawsock.go Loading commit data...
iprawsock_plan9.go Loading commit data...
iprawsock_posix.go Loading commit data...
iprawsock_test.go Loading commit data...
ipsock.go Loading commit data...
ipsock_plan9.go Loading commit data...
ipsock_posix.go Loading commit data...
ipsock_test.go Loading commit data...
listen_test.go Loading commit data...
lookup.go Loading commit data...
lookup_fake.go Loading commit data...
lookup_plan9.go Loading commit data...
lookup_test.go Loading commit data...
lookup_unix.go Loading commit data...
lookup_windows.go Loading commit data...
lookup_windows_test.go Loading commit data...
mac.go Loading commit data...
mac_test.go Loading commit data...
main_cloexec_test.go Loading commit data...
main_conf_test.go Loading commit data...
main_noconf_test.go Loading commit data...
main_plan9_test.go Loading commit data...
main_posix_test.go Loading commit data...
main_test.go Loading commit data...
main_unix_test.go Loading commit data...
main_windows_test.go Loading commit data...
mockserver_test.go Loading commit data...
net.go Loading commit data...
net_fake.go Loading commit data...
net_test.go Loading commit data...
net_windows_test.go Loading commit data...
netgo_unix_test.go Loading commit data...
nss.go Loading commit data...
nss_test.go Loading commit data...
packetconn_test.go Loading commit data...
parse.go Loading commit data...
parse_test.go Loading commit data...
pipe.go Loading commit data...
pipe_test.go Loading commit data...
platform_test.go Loading commit data...
port.go Loading commit data...
port_test.go Loading commit data...
port_unix.go Loading commit data...
protoconn_test.go Loading commit data...
rawconn.go Loading commit data...
rawconn_stub_test.go Loading commit data...
rawconn_test.go Loading commit data...
rawconn_unix_test.go Loading commit data...
rawconn_windows_test.go Loading commit data...
sendfile_linux.go Loading commit data...
sendfile_stub.go Loading commit data...
sendfile_test.go Loading commit data...
sendfile_unix_alt.go Loading commit data...
sendfile_windows.go Loading commit data...
server_test.go Loading commit data...
sock_bsd.go Loading commit data...
sock_cloexec.go Loading commit data...
sock_linux.go Loading commit data...
sock_plan9.go Loading commit data...
sock_posix.go Loading commit data...
sock_stub.go Loading commit data...
sock_windows.go Loading commit data...
sockaddr_posix.go Loading commit data...
sockopt_bsd.go Loading commit data...
sockopt_linux.go Loading commit data...
sockopt_plan9.go Loading commit data...
sockopt_posix.go Loading commit data...
sockopt_solaris.go Loading commit data...
sockopt_stub.go Loading commit data...
sockopt_windows.go Loading commit data...
sockoptip_bsdvar.go Loading commit data...
sockoptip_linux.go Loading commit data...
sockoptip_posix.go Loading commit data...
sockoptip_stub.go Loading commit data...
sockoptip_windows.go Loading commit data...
splice_linux.go Loading commit data...
splice_stub.go Loading commit data...
splice_test.go Loading commit data...
sys_cloexec.go Loading commit data...
tcpsock.go Loading commit data...
tcpsock_plan9.go Loading commit data...
tcpsock_posix.go Loading commit data...
tcpsock_test.go Loading commit data...
tcpsock_unix_test.go Loading commit data...
tcpsockopt_darwin.go Loading commit data...
tcpsockopt_dragonfly.go Loading commit data...
tcpsockopt_openbsd.go Loading commit data...
tcpsockopt_plan9.go Loading commit data...
tcpsockopt_posix.go Loading commit data...
tcpsockopt_solaris.go Loading commit data...
tcpsockopt_stub.go Loading commit data...
tcpsockopt_unix.go Loading commit data...
tcpsockopt_windows.go Loading commit data...
timeout_test.go Loading commit data...
udpsock.go Loading commit data...
udpsock_plan9.go Loading commit data...
udpsock_plan9_test.go Loading commit data...
udpsock_posix.go Loading commit data...
udpsock_test.go Loading commit data...
unixsock.go Loading commit data...
unixsock_linux_test.go Loading commit data...
unixsock_plan9.go Loading commit data...
unixsock_posix.go Loading commit data...
unixsock_test.go Loading commit data...
unixsock_windows_test.go Loading commit data...
write_unix_test.go Loading commit data...
writev_test.go Loading commit data...
writev_unix.go Loading commit data...