gpt4 book ai didi

c - Gprof 显示应用程序中从 调用的常规函数

转载 作者:行者123 更新时间:2023-12-03 19:13:44 25 4
gpt4 key购买 nike

所以 - 我一年来一直在写一个语言解释器作为一个副项目。今天终于决定第一次测试它的性能!也许我应该早点这样做......结果证明在该语言中运行斐波那契函数需要 x600 的等效 Python 程序时间。糟糕的雏菊。

无论如何......我要去分析了。在调用图中,gprof认为一些函数(即关键函数)是从 <spontaneous> 调用的.这是一个问题,因为了解最常调用这些函数的内容会对我有所帮助。

我像这样编译整个项目:

gcc *.c -o app.exe -g -pg -O2 -Wall -Wno-unused -LC:/msys64_new/mingw64/lib -lShlwapi

我用 gprof像这样:
gprof app.exe > gprofoutput.txt

由于它是一个语言解释器,因此其中许多函数(所有函数?)可能会作为相互递归链的一部分被调用。这可能是问题所在吗?如果是,是 gprof完全信任这个程序?
<spontaneous>调用的函数被编译为 *.c 的一部分项目的文件,并且不会被外部库或我知道的任何东西调用。

因为我已经检查过了,所以这里的其他答案关于 <spontaneous>还没有解决我的问题。是什么导致这些函数显示为从 <spontaneous> 调用的我该如何解决这个问题?

示例 gprof输出( _mcount_private__fentry__ 当然无关紧要 - 将它们包括在这里,以防它提供任何线索):
index % time    self  children    called     name
<spontaneous>
[1] 46.9 1.38 0.00 _mcount_private [1]
-----------------------------------------------
<spontaneous>
[2] 23.1 0.68 0.00 __fentry__ [2]
-----------------------------------------------
<spontaneous>
[3] 18.7 0.06 0.49 object_string_new [3]
0.17 0.24 5687901/5687901 cell_table_set_value [4]
0.00 0.08 5687901/7583875 make_native_function_with_params [7]
0.00 0.00 13271769/30578281 parser_parse [80]
-----------------------------------------------
0.17 0.24 5687901/5687901 object_string_new [3]
[4] 14.1 0.17 0.24 5687901 cell_table_set_value [4]
0.12 0.05 5687901/5930697 table_set_value_directly [6]
0.02 0.04 5687901/7341054 table_get_value_directly [9]
0.01 0.00 5687901/5930694 object_cell_new [31]
-----------------------------------------------
<spontaneous>
[5] 7.0 0.07 0.14 vm_interpret_frame [5]
0.01 0.05 1410341/1410345 cell_table_get_value_cstring_key [13]
0.01 0.02 242786/242794 cell_table_set_value_cstring_key [19]
0.02 0.00 3259885/3502670 object_thread_pop_eval_stack [22]
0.01 0.00 242785/242786 value_array_free [28]
0.00 0.01 242785/242785 vm_call_object [34]
0.00 0.00 681987/1849546 value_compare [32]
0.00 0.00 485570/31306651 table_init [20]
0.00 0.00 242785/242788 cell_table_free [38]
0.00 0.00 242785/25375951 cell_table_init [29]
0.00 0.00 1/1 object_load_attribute [50]
0.00 0.00 1/1 object_load_attribute_cstring_key [52]
0.00 0.00 1/2 object_user_function_new [56]
0.00 0.00 2/33884613 copy_cstring [17]
0.00 0.00 1/5687909 object_function_set_name [25]
0.00 0.00 1/17063722 copy_null_terminated_cstring [23]
0.00 0.00 1/72532402 allocate [21]
0.00 0.00 3502671/3502671 object_thread_push_eval_stack [81]
0.00 0.00 1167557/1167557 object_as_string [85]
0.00 0.00 681988/681995 two_bytes_to_short [86]
0.00 0.00 485572/485578 value_array_make [88]
0.00 0.00 242786/242786 object_thread_push_frame [96]
0.00 0.00 242786/242786 object_thread_peek_frame [95]
0.00 0.00 242785/242785 object_thread_pop_frame [97]
0.00 0.00 242785/485571 vm_import_module [89]
0.00 0.00 2/1167575 object_value_is [83]
-----------------------------------------------

..... etc .........

我在 Windows 7 上运行 Mingw-w64 GCC。

最佳答案

来自 the gprof manual :

If the identity of the callers of a function cannot be determined, a dummy caller-line is printed which has `' as the "caller's name" and all other fields blank. This can happen for signal handlers.



看起来 gprof 不知道您的来电者的姓名。如果任何潜在的调用者(包括异步调度,如果您正在使用它)是在没有符号的情况下编译的,那么调用者的名称将不会被知道。您使用的是哪些第三方库?你能得到他们的调试符号吗?

您可以获得 Windows symbol packages ,虽然我不知道涵盖了哪些库。该页面还讨论了使用 Microsoft 的符号服务器而不是下载(可能已过时的)符号包。

关于c - Gprof 显示应用程序中从 <spontaneous> 调用的常规函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61345117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com