我已经编写了一个多goroutine基准测试。然后,我使用go工具pprof分析了如何优化代码。当我使用top10显示一些信息时,得到以下输出:
Showing top 10 nodes out of 167
flat flat% sum% cum cum%
4700ms 17.86% 17.86% 4700ms 17.86% runtime.pthread_cond_signal
1790ms 6.80% 24.66% 1790ms 6.80% cmpbody
1470ms 5.59% 30.24% 1620ms 6.16% syscall.syscall
1360ms 5.17% 35.41% 3280ms 12.46% runtime.scanobject
1170ms 4.45% 39.86% 1410ms 5.36% runtime.findObject
960ms 3.65% 43.50% 960ms 3.65% runtime.pthread_cond_wait
950ms 3.61% 47.11% 950ms 3.61% runtime.memmove
650ms 2.47% 49.58% 650ms 2.47% runtime.usleep
650ms 2.47% 52.05% 2490ms 9.46% talent.TopN.func1
630ms 2.39% 54.45% 2890ms 10.98% runtime.mallocgc
很明显,runtime.pthread_cond_signal在我的代码中花费了很多时间。我尝试在Google上搜索有关runtime.pthread_cond_signal的一些可用信息。但是没有得到他们。尽管有些帖子提到了它,但它们仅提供了一些技巧,让我对此仍然感到困惑。
我想这种情况与Go中频道的使用情况有关,但是我不确定我的看法,我也不知道有关此事的一些细节。
我想知道的是以下内容:
什么会导致花很多时间在运行时。pthread_cond_signal通常是什么?
在正常情况下,在这种情况下如何优化go代码?
随时提供任何信息和建议。 希望收到您的任何帮助。
答案 0 :(得分:0)
这可能意味着您的代码正在执行很多锁定/解锁操作。 pthread_cond_signal
用于通知条件变量,似乎仅由OS X上的Go使用。它用于semawakeup
原语中的unlock
的实现中,该原语在完成锁定/解锁的所有地方都使用。
根据注释的建议,尝试使用(web)
中的go tool pprof
命令来查看这些调用的来源。
在不查看特定基准的情况下很难提供更多详细信息。