portlist: use win32 calls instead of running netstat process [windows]
Turns out using win32 instead of shelling out to child processes is a
bit faster:
name old time/op new time/op delta
GetListIncremental-4 278ms ± 2% 0ms ± 7% -99.93% (p=0.000 n=8+10)
name old alloc/op new alloc/op delta
GetListIncremental-4 238kB ± 0% 9kB ± 0% -96.12% (p=0.000 n=10+8)
name old allocs/op new allocs/op delta
GetListIncremental-4 1.19k ± 0% 0.02k ± 0% -98.49% (p=0.000 n=10+10)
Fixes #3876 (sadly)
Change-Id: I1195ac5de21a8a8b3cdace5871d263e81aa27e91
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
527741d41f
commit
35bee36549
@@ -15,22 +15,12 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
var osHideWindow func(*exec.Cmd) // non-nil on Windows; see portlist_windows.go
|
||||
|
||||
// hideWindow returns c. On Windows it first sets SysProcAttr.HideWindow.
|
||||
func hideWindow(c *exec.Cmd) *exec.Cmd {
|
||||
if osHideWindow != nil {
|
||||
osHideWindow(c)
|
||||
}
|
||||
return c
|
||||
}
|
||||
|
||||
func appendListeningPortsNetstat(base []Port, arg string) ([]Port, error) {
|
||||
exe, err := exec.LookPath("netstat")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("netstat: lookup: %v", err)
|
||||
}
|
||||
output, err := hideWindow(exec.Command(exe, arg)).Output()
|
||||
output, err := exec.Command(exe, arg).Output()
|
||||
if err != nil {
|
||||
xe, ok := err.(*exec.ExitError)
|
||||
stderr := ""
|
||||
|
||||
Reference in New Issue
Block a user