expvar
包包含一个 init
函数,该函数将 memstats
和 cmdline
变量注册到 debug/vars
http 处理器。该包不提供删除这些默认值的方法,迫使用户处理它们。如果用户有一个方法可以在不使用 unsafe
或fork包的情况下删除这些默认值,那就太好了。
我添加的一个基准测试显示了默认值(当预期的总 expvar.Vars 数量较小时)产生的轻微但不必要的性能影响,但我认为真正的问题是美观:我的其他变量与内存使用或命令行无关,因此内存分析对应用程序是侵入性的。
我们也不能为了我们自己的目的使用 memstats
和 cmdline
。这对我个人没有影响。
goos: windows
goarch: amd64
pkg: expvar
BenchmarkExpvarHandler/cmdline.memstats-8 200000 7219 ns/op
BenchmarkExpvarHandler/none-8 5000000 278 ns/op
BenchmarkExpvarHandler/user.10.vars-8 300000 5130 ns/op
PASS
ok expvar 4.822s
func BenchmarkExpvarHandler(b *testing.B) {
for _, tc := range []struct {
Name string
Init func()
}{
{"cmdline.memstats", func() {}},
{"none", func() { RemoveAll() }},
{"user.10.vars", func() { for i := 0; i < 10; i++ { NewInt(fmt.Sprintf("i%d", i)) } }},
} {
tc.Init()
b.Run(tc.Name, func(b *testing.B) {
for n := 0; n < b.N; n++ {
expvarHandler(writer{}, nil)
}
})
}
}
type writer http.Header
func (w writer) WriteHeader(_ int) {}
func (w writer) Write(p []byte) (int, error) { return len(p), nil }
func (w writer) Header() http.Header { return http.Header(w) }
有趣的是,包的测试中包含一个未导出的 RemoveAll
函数。最近关闭的问题 #27555 详细讨论了这个问题,但没有提到删除默认变量的潜在用途。
5条答案
按热度按时间0yycz8jy1#
/cc @bradfitz
uelo1irk2#
https://golang.org/cl/200319提到了这个问题:
expvar: make possible to delete all exported variables
k3bvogb13#
尽管这个问题仍然存在,但changelog 200319已被标记为废弃,我在这里和https://golang.org/cl/200319上都看不到任何解释,PR #34832也被关闭了。
它只是被当作旧的遗弃了,还是实际上被拒绝了?它甚至曾经是1.13、1.14里程碑的一部分,然后在@rsc将其从那里移除之前。
将
RemoveAll
从测试代码移动到主代码的这个小补丁解决了cmdline
和memstats
的自动发布问题,并提供了一个更通用的解决方案来重置expvar
配置。有什么办法可以让这个问题/CL重新活跃起来吗?pinkon5k4#
由于变更已过期,因此将其关闭。这是一个不应该发生的错误。一旦变更被关闭,GitHub上的拉取请求也被关闭,GitHub仓库也被删除。所以你或者某人需要从Gerrit中仍然存在的数据重新创建这个变更。对此表示歉意。
然而,这个变更引入了新的API,我们通常的流程是提出一个提案,如https://go.dev/s/proposal-process中所概述的。我们可以打开一个新的问题,或者将这个问题更改为关于这个变更的提案,根据你的喜好进行选择。
8oomwypt5#
我发现了这个,称之为处理器$x_1m^0n_1^x$,而不是$x_1a^0b_1^x$。