comparaison des performances à plusieurs reprises - Tous les appels après la première instruction sont mises en cache?

StackOverflow https://stackoverflow.com/questions/7819671

  •  26-10-2019
  •  | 
  •  

Question

J'écris une petite bibliothèque d'analyse comparative en C qui est utilisé pour les fonctions simples de référence. La façon dont cela fonctionne est que vous fournissiez la fonction d'étalonnage avec un pointeur vers une fonction void sans paramètres et les itérations numériques. La fonction retourne alors un struct avec des informations sur

Cependant lorsque l'on examine les résultats individuels que je vois que le premier appel prend beaucoup de temps et les appels après prend très peu de temps.

Je me demande:

  1. Est-ce en raison de la mise en cache d'instructions?
  2. Si oui à la première question, comment n'analyse comparative des outils sont généralement conformes à cela? le premier appel est exclu?
  3. Si oui à la première question, est-il un cas où la mise en cache est pas appliquée à une fonction?
  4. Si oui à la première question, ne cache se produisent sur des fonctions entières ou segments d'une fonction?
  5. Si oui à la première question, est-il autre chose que j'estimerait que je devrais lire sur et mieux comprendre?

Données et code

La fonction qui récupère le temps:

double currentTime()
{
    struct timeval time;
    struct timezone timezone;
    gettimeofday(&time, &timezone);
    return time.tv_sec + time.tv_usec * 1e-6;
}

Résultat du test:

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

Résultat sans l'optimisation de drapeau:

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

La fonction testée qui produit ce résultat:

void test()
{
    unsigned int i = 0;
    while(i++ < UINT_MAX){}
}

Makefile:

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 pension avec tout le code:

https://github.com/Ancide/TinyBench

Edit: Vous avez oublié de compilateur mention et drapeaux du compilateur

Edit 2: repo git Ajouté avec tout le code au cas où quelqu'un veut voir tout

Modifier 3: résultats ajoutés withouth drapeau O2

Était-ce utile?

La solution

Ceci est normal dans les systèmes d'exploitation de la mémoire virtuelle. Le premier appel à une fonction tend à générer une erreur de page qui charge le code du fichier exécutable dans la RAM. Si vous êtes intéressé par le code réel alors vous perf ignorer le premier appel. Si vous êtes intéressé par des mesures réalistes de perf alors vous ne l'ignorez pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top