go expvar:使删除memstat和cmdline默认值成为可能

31moq8wy  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(144)

expvar 包包含一个 init 函数,该函数将 memstatscmdline 变量注册到 debug/vars http 处理器。该包不提供删除这些默认值的方法,迫使用户处理它们。如果用户有一个方法可以在不使用 unsafe 或fork包的情况下删除这些默认值,那就太好了。
我添加的一个基准测试显示了默认值(当预期的总 expvar.Vars 数量较小时)产生的轻微但不必要的性能影响,但我认为真正的问题是美观:我的其他变量与内存使用或命令行无关,因此内存分析对应用程序是侵入性的。
我们也不能为了我们自己的目的使用 memstatscmdline。这对我个人没有影响。

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 详细讨论了这个问题,但没有提到删除默认变量的潜在用途。

uelo1irk

uelo1irk2#

https://golang.org/cl/200319提到了这个问题:expvar: make possible to delete all exported variables

k3bvogb1

k3bvogb13#

尽管这个问题仍然存在,但changelog 200319已被标记为废弃,我在这里和https://golang.org/cl/200319上都看不到任何解释,PR #34832也被关闭了。
它只是被当作旧的遗弃了,还是实际上被拒绝了?它甚至曾经是1.13、1.14里程碑的一部分,然后在@rsc将其从那里移除之前。
RemoveAll从测试代码移动到主代码的这个小补丁解决了cmdlinememstats的自动发布问题,并提供了一个更通用的解决方案来重置expvar配置。有什么办法可以让这个问题/CL重新活跃起来吗?

pinkon5k

pinkon5k4#

由于变更已过期,因此将其关闭。这是一个不应该发生的错误。一旦变更被关闭,GitHub上的拉取请求也被关闭,GitHub仓库也被删除。所以你或者某人需要从Gerrit中仍然存在的数据重新创建这个变更。对此表示歉意。

然而,这个变更引入了新的API,我们通常的流程是提出一个提案,如https://go.dev/s/proposal-process中所概述的。我们可以打开一个新的问题,或者将这个问题更改为关于这个变更的提案,根据你的喜好进行选择。

8oomwypt

8oomwypt5#

我发现了这个,称之为处理器$x_1m^0n_1^x$,而不是$x_1a^0b_1^x$。

相关问题