net: ensure dnsConfig search list is rooted

Avoids some extra work and string concatenation at query time.

benchmark                                      old allocs     new allocs     delta
BenchmarkGoLookupIP-32                         154            150            -2.60%
BenchmarkGoLookupIPNoSuchHost-32               446            442            -0.90%
BenchmarkGoLookupIPWithBrokenNameServer-32     564            568            +0.71%

benchmark                                      old bytes     new bytes     delta
BenchmarkGoLookupIP-32                         10824         10704         -1.11%
BenchmarkGoLookupIPNoSuchHost-32               43140         42992         -0.34%
BenchmarkGoLookupIPWithBrokenNameServer-32     46616         46680         +0.14%

BenchmarkGoLookupIPWithBrokenNameServer's regression appears to be
because it's actually only performing 1 LookupIP call, so the extra
work done parsing the DNS config file doesn't amortize as well as for
BenchmarkGoLookupIP or BenchmarkGoLOokupIPNoSuchHost, which perform
2000+ LookupIP calls per run.

Update #15473.

Change-Id: I98c8072f2f39e2f2ccd6c55e9e9bd309f5ad68f8
Reviewed-on: https://go-review.googlesource.com/22571
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Matthew Dempsky 2016-04-28 11:31:59 -07:00
parent 4d9bda51ff
commit 5fe1b35ed2
3 changed files with 27 additions and 20 deletions

View file

@ -361,23 +361,23 @@ func (conf *dnsConfig) nameList(name string) []string {
if rooted {
return []string{name}
}
hasNdots := count(name, '.') >= conf.ndots
name += "."
// Build list of search choices.
names := make([]string, 0, 1+len(conf.search))
// If name has enough dots, try unsuffixed first.
if count(name, '.') >= conf.ndots {
names = append(names, name+".")
if hasNdots {
names = append(names, name)
}
// Try suffixes.
for _, suffix := range conf.search {
suffixed := name + "." + suffix
if suffixed[len(suffixed)-1] != '.' {
suffixed += "."
}
names = append(names, suffixed)
names = append(names, name+suffix)
}
// Try unsuffixed, if not tried first above.
if count(name, '.') < conf.ndots {
names = append(names, name+".")
if !hasNdots {
names = append(names, name)
}
return names
}