Benchmark
 All Classes Files Functions Variables Typedefs Macros
Macros | Functions
io.c File Reference

Compare les performances de read/write avec fgets/fputs. More...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include "benchmark.h"
#include "copy.h"

Macros

#define _GNU_SOURCE
 
#define O_DIRECT   0
 
#define FILE_SIZE   0x40000
 
#define BUF_SIZE   0x10000
 
#define MAX_LEN   0X100000
 
#define PERF_LEN   512
 
#define IN   "tmpin.dat"
 
#define OUT   "tmpout.dat"
 

Functions

int main (int argc, char *argv[])
 

Detailed Description

Compare les performances de read/write avec fgets/fputs.

Compare aussi l'impact de la kernel buffer cache et du buffer au niveau de stdio. C'est inspiré du chapitre 13 du livre "The Linux programming interface" par Michael Kerrisk.

Macro Definition Documentation

#define _GNU_SOURCE
#define BUF_SIZE   0x10000
#define FILE_SIZE   0x40000
#define IN   "tmpin.dat"
#define MAX_LEN   0X100000
#define O_DIRECT   0
#define OUT   "tmpout.dat"
#define PERF_LEN   512

Function Documentation

int main ( int  argc,
char *  argv[] 
)

Si il y a des arguments, –sys_sync, –sys_nosync, –sys_direct, –std_buf et –std_nobuf font uniquement le test correspondant avec une taille de PERF_LEN.

On commence avec 512 pour sys_sync parce qu'en dessous très lent et que de toute façon sys_direct ne sais pas aller en dessous et le reste du graphe serait moins lisible même en log y.

Pour sys_sync, len doit être un multiple de la taille d'un block du file system. 512 est ok selon le Kerrisk cité plus haut.

34  {
40  if (argc > 1) {
41  // perf
42  if (strncmp(argv[1], "--sys_sync", 11) == 0) {
43  read_write(NULL, NULL, IN, OUT, FILE_SIZE, PERF_LEN, O_SYNC);
44  } else if (strncmp(argv[1], "--sys_nosync", 13) == 0) {
45  read_write(NULL, NULL, IN, OUT, FILE_SIZE, PERF_LEN, 0);
46  } else if (strncmp(argv[1], "--sys_direct", 13) == 0) {
47  read_write(NULL, NULL, IN, OUT, FILE_SIZE, PERF_LEN, O_SYNC | O_DIRECT);
48  } else if (strncmp(argv[1], "--std_buf", 10) == 0) {
49  gets_puts(NULL, NULL, IN, OUT, FILE_SIZE, PERF_LEN, 1, BUF_SIZE);
50  } else if (strncmp(argv[1], "--std_nobuf", 12) == 0) {
51  gets_puts(NULL, NULL, IN, OUT, FILE_SIZE, PERF_LEN, 0, 0);
52  }
53  } else {
54  // benchmark
55  timer *t = timer_alloc();
56  size_t len = 0;
57 
58  recorder *sys_sync_rec = recorder_alloc("sys_sync.csv");
59  recorder *sys_nosync_rec = recorder_alloc("sys_nosync.csv");
60  recorder *sys_direct_rec = recorder_alloc("sys_direct.csv");
67  for (len = 512; len <= MAX_LEN; len *= 0x2) {
68  read_write(t, sys_sync_rec, IN, OUT, FILE_SIZE, len, O_SYNC);
69  }
70  for (len = 2; len <= MAX_LEN; len *= 0x2) {
71  read_write(t, sys_nosync_rec, IN, OUT, FILE_SIZE, len, 0);
72  }
77  for (len = 512; len <= MAX_LEN; len *= 2) {
78  read_write(t, sys_direct_rec, IN, OUT, FILE_SIZE, len, O_SYNC | O_DIRECT);
79  }
80  recorder_free(sys_sync_rec);
81  recorder_free(sys_nosync_rec);
82  recorder_free(sys_direct_rec);
83 
84  recorder *std_buf_rec = recorder_alloc("std_buf.csv");
85  recorder *std_nobuf_rec = recorder_alloc("std_nobuf.csv");
86  for (len = 2; len <= MAX_LEN; len *= 0x2) {
87  gets_puts(t, std_buf_rec, IN, OUT, FILE_SIZE, len, 1, BUF_SIZE);
88  }
89  for (len = 2; len <= MAX_LEN; len *= 0x2) {
90  gets_puts(t, std_nobuf_rec, IN, OUT, FILE_SIZE, len, 0, 0);
91  }
92  recorder_free(std_buf_rec);
93  recorder_free(std_nobuf_rec);
94 
95  timer_free(t);
96  }
97 
98  return EXIT_SUCCESS;
99 }
void gets_puts(timer *t, recorder *rec, char *in, char *out, size_t file_size, size_t len, int has_buf, size_t buf_size)
Copie le fichier in dans le fichier out avec stdio
Definition: copy.c:175
void timer_free(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:172
recorder écrit les temps dans un fichier .csv
Definition: benchmark.c:208
#define PERF_LEN
Definition: io.c:29
#define FILE_SIZE
Definition: io.c:25
void read_write(timer *t, recorder *rec, char *in, char *out, size_t file_size, size_t len, int flags)
Copie le fichier in dans le fichier out sans stdio
Definition: copy.c:90
timer permet de mesurer le temps écoulé entre deux moments
Definition: benchmark.c:43
timer * t
Definition: memfork.c:25
#define BUF_SIZE
Definition: io.c:27
#define IN
Definition: io.c:31
recorder * recorder_alloc(char *filename)
Alloue un recorder
Definition: benchmark.c:219
#define OUT
Definition: io.c:32
void recorder_free(recorder *rec)
Libère toutes les resources utilisées par rec
Definition: benchmark.c:263
timer * timer_alloc()
Alloue un timer
Definition: benchmark.c:63
#define O_DIRECT
Definition: io.c:19
#define MAX_LEN
Definition: io.c:28