Я пишу небольшую библиотеку для тестирования производительности в C, которая используется для тестирования отдельных функций. Это работает так, что вы предоставляете функцию сравнения с указателем на функцию void
без параметров и числовых итераций. Затем функция возвращает struct
с информацией о
Однако, глядя на отдельные результаты, я вижу, что первый вызов занимает много времени, а затем последующие вызовы занимают очень мало времени.
Вот мне и интересно:
- Это связано с кэшированием инструкций?
- Если да к первому вопросу, как инструменты сопоставления обычно соответствуют этому? Первый звонок исключен?
- Если да на первый вопрос, есть ли случай, когда кеширование не применяется к функции?
- Если да к первому вопросу, происходит ли кэширование целых функций или сегментов функции?
- Если да к первому вопросу, могу ли я считать, что мне следует читать дальше и лучше понимать?
Данные и код
Функция, которая извлекает время:
double currentTime()
{
struct timeval time;
struct timezone timezone;
gettimeofday(&time, &timezone);
return time.tv_sec + time.tv_usec * 1e-6;
}
Результат теста:
0.000319
0.000000
0.000000
0.000000
0.000001
0.000000
0.000000
0.000000
0.000000
0.000000
Total time: 0.000320
Average time: 0.000032
Worst time: 0.000319
Best time: 0.000000
Результат без флага оптимизации:
13.425430
13.349757
13.482863
13.129472
13.020705
13.672982
13.027595
13.139602
13.028962
13.107892
Total time: 132.385260
Average time: 13.238526
Worst time: 13.672982
Best time: 13.020705
Тестируемая функция, которая дает такой результат:
void test()
{
unsigned int i = 0;
while(i++ < UINT_MAX){}
}
Создать файл:
CC = gcc
MAIN = main.c
SOURCES = lib/tb_time_handling.c lib/tb_rendering.c tb_benching.c
OUTPUT = main
FLAGS = -Wall -pedantic -O2
all: main
main:
$(CC) $(MAIN) $(SOURCES) -o $(OUTPUT) $(FLAGS)
Github репо со всем кодом:
https://github.com/Ancide/TinyBench
Редактировать: Забыл упомянуть флаги компилятора и
Редактировать 2: Добавлено git-репо со всем кодом на случай, если кто-то захочет все увидеть
Редактировать 3: добавлены результаты без флага O2