Сравнительный анализ функций несколько раз - все вызовы после первого кешируются? - PullRequest
0 голосов
/ 19 октября 2011

Я пишу небольшую библиотеку для тестирования производительности в C, которая используется для тестирования отдельных функций. Это работает так, что вы предоставляете функцию сравнения с указателем на функцию void без параметров и числовых итераций. Затем функция возвращает struct с информацией о

Однако, глядя на отдельные результаты, я вижу, что первый вызов занимает много времени, а затем последующие вызовы занимают очень мало времени.

Вот мне и интересно:

  1. Это связано с кэшированием инструкций?
  2. Если да к первому вопросу, как инструменты сопоставления обычно соответствуют этому? Первый звонок исключен?
  3. Если да на первый вопрос, есть ли случай, когда кеширование не применяется к функции?
  4. Если да к первому вопросу, происходит ли кэширование целых функций или сегментов функции?
  5. Если да к первому вопросу, могу ли я считать, что мне следует читать дальше и лучше понимать?

Данные и код

Функция, которая извлекает время:

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

1 Ответ

1 голос
/ 19 октября 2011

Это нормально в операционных системах виртуальной памяти. Первый вызов функции имеет тенденцию генерировать ошибку страницы, которая загружает код из исполняемого файла в оперативную память. Если вас интересует реальный код, то вы игнорируете первый вызов. Если вас интересуют реалистичные измерения перфорации, вы не должны их игнорировать.

...