Итак, я уже год пишу переводчик как сторонний проект. Сегодня я наконец-то решил впервые проверить его работоспособность! Может быть, я должен был сделать это раньше ... оказывается, что запуск функции Фибоначчи на языке занимает x600 времени эквивалентной Python программы. Whoopsy Daisy.
Во всяком случае ... Я приступил к профилированию. В графе вызовов 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
файлов проекта и не вызываются внешним библиотека или что-нибудь, о чем я знаю.
Поскольку я проверил это, другие ответы на SO, касающиеся <spontaneous>
, не решили мою проблему. Что может вызывать появление этих функций как вызванных из <spontaneous>
и как я могу это исправить?
Пример gprof
output (_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 .........
Я использую Mingw-w64 G CC на Windows 7.