go - Golang: 什么是 etext?

  显示原文与译文双语对照的内容
0 0

我已经开始剖析一些 Go1.2 代码,而顶部的项目总是一个名为'etext'的东西。 我已经搜索过了,但没有发现它可能与在 go 例程中的调用深度相关的信息。 但是,我没有使用任何 go 例程,'etext'仍然占用了 75%或者更多的执行时间。


(pprof) top20 
Total: 171 samples
 128 74.9% 74.9% 128 74.9% etext

谁能解释这是什么,如果有什么方法可以降低影响?

时间: 原作者:

0 0

我遇到了同样的问题,然后我发现: pprof在 go 1.2中中断? 。,以确认它是 1.2 Bug 我写"欢迎世界"程序如下:


package main

import (
"fmt"
"testing"
)

func BenchmarkPrintln( t *testing.B ){
 TestPrintln( nil )
}

func TestPrintln( t *testing.T ){
 for i := 0; i <10000; i++ {
 fmt.Println("hello" +" world!")
 }
}

就像你所看到的,它只调用 fmt.Println 。

你可以用"go 测试 –c 。"。/测试。测试 -test.bench 编译这个。 -test 。cpuprofile=test 。"查看结果的结果"go 工具 pprof test.test test.prof"


(pprof) top10
Total: 36 samples
 18 50.0% 50.0% 18 50.0% syscall.Syscall
 8 22.2% 72.2% 8 22.2% etext
 4 11.1% 83.3% 4 11.1% runtime.usleep
 3 8.3% 91.7% 3 8.3% runtime.futex
 1 2.8% 94.4% 1 2.8% MHeap_AllocLocked
 1 2.8% 97.2% 1 2.8% fmt.(*fmt).padString
 1 2.8% 100.0% 1 2.8% os.epipecheck
 0 0.0% 100.0% 1 2.8% MCentral_Grow
 0 0.0% 100.0% 33 91.7% System
 0 0.0% 100.0% 3 8.3% _/home/xxiao/work/test.BenchmarkPrintln

使用 go 1.2.1得到了上述结果,然后使用 go 1.1.1进行了同样的操作,得到了以下结果:


(pprof) top10
Total: 10 samples
 2 20.0% 20.0% 2 20.0% scanblock
 1 10.0% 30.0% 1 10.0% fmt.(*pp).free
 1 10.0% 40.0% 1 10.0% fmt.(*pp).printField
 1 10.0% 50.0% 2 20.0% fmt.newPrinter
 1 10.0% 60.0% 2 20.0% os.(*File).Write
 1 10.0% 70.0% 1 10.0% runtime.MCache_Alloc
 1 10.0% 80.0% 1 10.0% runtime.exitsyscall
 1 10.0% 90.0% 1 10.0% sweepspan
 1 10.0% 100.0% 1 10.0% sync.(*Mutex).Lock
 0 0.0% 100.0% 6 60.0% _/home/xxiao/work/test.BenchmarkPrintln

你可以看到 1.2.1的结果并没有什么意义。 系统调用和etext花费了大部分时间。 1.1.1结果看起来是正确的。

所以我相信它真的是一个 1.2.1 Bug 。 在我的实际项目中,我切换到使用 go 1.1.1,并且对分析结果满意。

0 0

我认为 Mathias Urlichs对你的cgo代码中缺少调试符号是正确的。 值得注意的是,像网络和系统系统这样的标准应用程序使用了 cgo 。

如果你向下滚动到这个 doc文档的底部调用警告,你可以看到第三个项目符号。

如果在没有用足够符号信息编译的库中链接的程序,与库相关的所有示例都可能会在库之前的程序中被赋予最后一个符号。 这将人为增加该符号的计数。

我不是 100%正这就是发生的事情,但我打赌这就是为什么etext看起来如此繁忙的原因。

...