什么是“__GI_memset”?为什么要花费这么多 CPU 资源?

what is `__GI_memset`? why does it cost so much CPU resource?

我是 perf 的新手,我正在尝试用它来分析我的程序。

我在 运行 perf top:

时得到了这个
 PerfTop:     296 irqs/sec  kernel:62.8%  exact:  0.0% [1000Hz cycles:ppp],  (all, 6 CPUs)
-----------------------------------------------------------------------------------------------------------------------

    65.43%  libc-2.23.so                  [.] __GI_memset
     1.55%  libopencv_imgcodecs.so.4.4.0  [.] cv::icvCvt_BGR2RGB_8u_C3R
     1.54%  libc-2.23.so                  [.] malloc
     1.32%  libc-2.23.so                  [.] _int_free
     0.92%  [kernel]                      [k] clear_page
     0.91%  libjpeg.so.8.0.2              [.] 0x000000000001b828
     0.90%  libc-2.23.so                  [.] memcpy

所以,我只是想知道我 65% 的 CPU 资源花费了什么,它真的只是 libc 中的 memset 吗? 如果是,怎么会花这么多钱?

what is __GI_memset?

这是 memset 的内部别名。

why does it cost so much CPU resource?

因为你经常调用它,或者因为你给了它很多内存设置了一些值。

根据您下一个最昂贵的符号 cv::icvCvt_BGR2RGB_8u_C3R 判断,您正在进行某种图像处理,并且可能正在分配 已清除 个图像。

一个常见的错误是分配一个已清除的图像并立即将其设置为其他内容(从而浪费了清除它所花费的时间)。但是这里没有足够的信息来推断你是否在这里这样做。