Учитывая следующий код, который либо вызывает F или G
#include <stdlib.h>
#include <stdio.h>
int f() {
return 0;
}
int g() {
return 1;
}
int main() {
long sum = 0;
for(int i = 0; i < 1000*1000*1000; i++) {
int result;
if(rand() % 2 == 0) {
result = f();
}
else {
result = g();
}
sum += result;
}
printf("%ld\n", sum);
}
Я собираю с
g++ test.c -o doom -lprofiler -lunwind
И беги с
CPUPROFILE=./test.txt ./test
А затем сгенерировать GIF с
pprof --gif ./test ./test.txt > output.gif
Я получаю следующее
Однако у меня есть ребра, идущие от f к g, и f к себе, и g к себе. Оптимизации нет (и я попробовал снова с -O0, чтобы быть уверенным), и я также попробовал с и без -lunwind.
Почему профилировщик считает, что f вызывает g (и сам иногда)? Как правильно использовать профилировщик?
Задача ещё не решена.