什么会导致去在运行时中花费这么多时间。pthread_cond_signal

时间:2019-04-28 17:59:31

标签: go channel pprof

我已经编写了一个多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中频道的使用情况有关,但是我不确定我的看法,我也不知道有关此事的一些细节。

我想知道的是以下内容:

  1. 什么会导致花很多时间在运行时。pthread_cond_signal通常是什么?

  2. 在正常情况下,在这种情况下如何优化go代码?

随时提供任何信息和建议。 希望收到您的任何帮助。

1 个答案:

答案 0 :(得分:0)

这可能意味着您的代码正在执行很多锁定/解锁操作。 pthread_cond_signal用于通知条件变量,似乎仅由OS X上的Go使用。它用于semawakeup原语中的unlock的实现中,该原语在完成锁定/解锁的所有地方都使用。

根据注释的建议,尝试使用(web)中的go tool pprof命令来查看这些调用的来源。

在不查看特定基准的情况下很难提供更多详细信息。