我已经开始对我的Go1.2代码进行分析,而排在最前面的项目总是名为“etext”的东西。我已经搜索了很多资料,但除了它可能与Go例程中的调用深度有关之外,并没有找到太多信息。但是,我并没有使用任何Go例程,“etext”仍然占据了总执行时间的75%或更多。
(pprof) top20
Total: 171 samples
128 74.9% 74.9% 128 74.9% etext
有人能解释一下这是什么,是否有任何方法来减少影响吗?
我已经开始对我的Go1.2代码进行分析,而排在最前面的项目总是名为“etext”的东西。我已经搜索了很多资料,但除了它可能与Go例程中的调用深度有关之外,并没有找到太多信息。但是,我并没有使用任何Go例程,“etext”仍然占据了总执行时间的75%或更多。
(pprof) top20
Total: 171 samples
128 74.9% 74.9% 128 74.9% etext
有人能解释一下这是什么,是否有任何方法来减少影响吗?
我曾遇到同样的问题,后来发现了这篇文章:go1.2版本的pprof出现问题?。为了验证是否真的是1.2版本的bug,我编写了以下的“hello world”程序:
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 test -c”编译它。 使用“./test.test -test.bench . -test.cpuprofile=test.prof”运行。 使用“go tool 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