5

我在 go 中编写了一个多 goroutine 基准测试。我使用 go tool 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 在我的代码中花费了很多时间。我尝试用谷歌搜索一些关于 runtime.pthread_cond_signal 的可用信息。但未能得到他们。尽管有些帖子提到了它,但它们只是提供了一些提示,让我仍然对此感到困惑。

我想这种情况是相对于 Go 中频道的使用情况,但我不确定我的意见,我也不知道一些细节。

我想知道的是:

  1. 什么会导致 go 通常在 runtime.pthread_cond_signal 上花费这么多时间?

  2. 正常情况下,遇到这种情况如何优化你的go代码?</p>

随时提供任何信息和建议。我很高兴收到您的任何帮助。

4

1 回答 1

4

这可能意味着您的代码正在执行大量锁定/解锁操作。pthread_cond_signal用于通知条件变量,并且似乎仅由 OSX 上的 Go 使用。它用于实现,semawakeup其本身在unlock原语中使用,在任何锁定/解锁完成的地方都使用它。

正如评论所建议的那样,尝试输入(web)命令go tool pprof以查看这些调用的来源。

如果没有查看您的特定基准,很难提供更多详细信息。

于 2019-04-30T13:21:28.517 回答