]> arthur.barton.de Git - netdata.git/blob - src/old-and-tests/benchmark.c
cleanup: remove trailing spaces
[netdata.git] / src / old-and-tests / benchmark.c
1 #define _GNU_SOURCE
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <string.h>
9 #include <malloc.h>
10 #include <inttypes.h>
11
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <sys/mman.h>
15
16 #define FASTFILE_NORMAL 1
17
18 #ifdef FASTFILE_NORMAL
19 #define FASTFILE_BUFFER 65536
20 #define FASTFILE_MAX_LINE_LENGTH 4096
21 #endif
22
23 typedef struct {
24         int fd;
25
26         ssize_t cursor;
27
28         char buffer[FASTFILE_BUFFER + 1];
29         ssize_t size;
30         int eof;
31 } fastfile;
32
33 fastfile *fastfile_open(const char *filename) {
34         fastfile *ff = malloc(sizeof(fastfile));
35         if(!ff) goto cleanup;
36
37         ff->fd = open(filename, O_RDONLY|O_NOATIME, 0666);
38         if(ff->fd == -1) goto cleanup;
39
40         ff->cursor = ff->size = ff->eof = 0;
41         ff->buffer[0] = '\0';
42
43         ssize_t r = read(ff->fd, &ff->buffer[ff->size], FASTFILE_BUFFER);
44         if(r != -1) {
45                 ff->buffer[r + 1] = '\0';
46                 ff->size = r;
47                 if(r < FASTFILE_BUFFER) ff->eof = 1;
48         }
49         else goto cleanup;
50
51         return ff;
52
53 cleanup:
54         if(ff) {
55                 if(ff->fd != -1) close(ff->fd);
56                 free(ff);
57         }
58         return NULL;
59 }
60
61 void fastfile_close(fastfile *ff) {
62         if(ff->fd != -1) close(ff->fd);
63         free(ff);
64 }
65
66 char *fastfile_getline(fastfile *ff) {
67         if( !ff->eof && ff->size == FASTFILE_BUFFER && ( ff->cursor + FASTFILE_MAX_LINE_LENGTH ) > ff->size ) {
68                 // if(ff->size) fprintf(stderr, "Read more\n");
69
70                 memmove(ff->buffer, &ff->buffer[ff->cursor], ff->size - ff->cursor + 1);
71                 ff->size -= ff->cursor;
72                 ff->cursor = 0;
73
74                 ssize_t remaining = FASTFILE_BUFFER - ff->size;
75                 // fprintf(stderr, "Reading up to %ld bytes\n", remaining);
76                 ssize_t r = read(ff->fd, &ff->buffer[ff->size], remaining);
77                 if(r != -1) {
78                         ff->buffer[r + 1] = '\0';
79                         ff->size = r;
80                         // fprintf(stderr, "Read %ld bytes\n", r);
81                 }
82
83                 if(!r || r < remaining) {
84                         // fprintf(stderr, "Read EOF\n");
85                         ff->eof = 1;
86                 }
87         }
88
89         //fprintf(stderr, "Line starts at %ld\n", ff->cursor);
90         if(ff->cursor >= ff->size) return NULL;
91
92         char *start = &ff->buffer[ff->cursor];
93         char *s = start;
94
95         while(*s != '\n' && *s != '\0') s++;
96         *s = '\0';
97         ff->cursor += ( s - start + 1 );
98         //fprintf(stderr, "Line ends at %ld\n", ff->cursor);
99
100         return start;
101 }
102
103 const char *filenames[] = {
104         "/proc/net/dev",
105         "/proc/diskstats",
106         "/proc/net/snmp",
107         "/proc/net/netstat",
108 //      "/proc/net/stat/nf_conntrack",
109 //      "/proc/net/ip_vs_stats",
110         "/proc/stat",
111         "/proc/meminfo",
112         "/proc/vmstat",
113         "/proc/self/mountstats",
114 //      "/var/log/messages",
115         NULL
116 };
117
118 int main(int argc, char **argv)
119 {
120         int i, k = 0;
121         fastfile *ff;
122         char *s;
123
124         for(i = 0; i < 400000 ;i++, k++) {
125                 if(filenames[k] == NULL) k = 0;
126
127                 //fprintf(stderr, "\nOpening file '%s'\n", filenames[k]);
128                 ff = fastfile_open(filenames[k]);
129                 if(!ff) {
130                         fprintf(stderr, "Cannot open file '%s', reason: %s\n", filenames[k], strerror(errno));
131                         exit(1);
132                 }
133
134                 while((s = fastfile_getline(ff))) ;
135                 //      fprintf(stderr, "%s\n", s);
136
137                 fastfile_close(ff);
138         }
139         return 0;
140 }