1 回答
TA贡献1805条经验 获得超10个赞
首先,我确认这个问题中的 Go 程序确实比 C++ 程序运行得明显慢。我认为知道原因确实很有趣。
我用 分析了 Go 客户端和服务器,pprof
发现这syscall.Syscall
占用了总执行时间的 70%。根据这张票,在 Go 中系统调用比在 C 中慢大约 1.4 倍。
(pprof) top -cum
Showing nodes accounting for 18.78s, 67.97% of 27.63s total
Dropped 44 nodes (cum <= 0.14s)
Showing top 10 nodes out of 44
flat flat% sum% cum cum%
0.11s 0.4% 0.4% 22.65s 81.98% main.main
0 0% 0.4% 22.65s 81.98% runtime.main
18.14s 65.65% 66.05% 19.91s 72.06% syscall.Syscall
0.03s 0.11% 66.16% 12.91s 46.72% net.(*conn).Read
0.10s 0.36% 66.52% 12.88s 46.62% net.(*netFD).Read
0.16s 0.58% 67.10% 12.78s 46.25% internal/poll.(*FD).Read
0.06s 0.22% 67.32% 11.87s 42.96% syscall.Read
0.11s 0.4% 67.72% 11.81s 42.74% syscall.read
0.02s 0.072% 67.79% 9.30s 33.66% net.(*conn).Write
0.05s 0.18% 67.97% 9.28s 33.59% net.(*netFD).Write
Conn.Write我逐渐减少和调用的次数Conn.Read并相应地增加缓冲区的大小,以便传输的字节数保持不变。结果是程序进行的这些调用越少,其性能就越接近 C++ 版本。
- 1 回答
- 0 关注
- 101 浏览
添加回答
举报