我已经开始介绍一些我的Go1.2代码,而顶级项目总是被命名为’etext’.我搜索过,但找不到很多关于它的信息,而不是它可能与Go例程中的调用深度有关.然而,我没有使用任何Go例程,’etext’仍占总执行时间的75%或更多.
(pprof) top20 Total: 171 samples 128 74.9% 74.9% 128 74.9% etext
任何人都可以解释这是什么,如果有办法减少影响?
解决方法
我遇到同样的问题,然后我发现这个:
pprof broken in go 1.2?.要验证它是一个真正的1.2错误我写了下面的“你好世界”程序:
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
上述结果是使用去1.2.1
然后我用同样的事情去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的结果没有什么意义.大部分时间都是Syscall和etext.而1.1.1结果正确.
所以我确信这是一个1.2.1的错误.而且我转而在我的实际项目中使用了1.1.1,我对现在的分析结果感到满意.