12 #include <sys/types.h>
16 #define FASTFILE_NORMAL 1
18 #ifdef FASTFILE_NORMAL
19 #define FASTFILE_BUFFER 65536
20 #define FASTFILE_MAX_LINE_LENGTH 4096
28 char buffer[FASTFILE_BUFFER + 1];
33 fastfile *fastfile_open(const char *filename) {
34 fastfile *ff = malloc(sizeof(fastfile));
37 ff->fd = open(filename, O_RDONLY|O_NOATIME, 0666);
38 if(ff->fd == -1) goto cleanup;
40 ff->cursor = ff->size = ff->eof = 0;
43 ssize_t r = read(ff->fd, &ff->buffer[ff->size], FASTFILE_BUFFER);
45 ff->buffer[r + 1] = '\0';
47 if(r < FASTFILE_BUFFER) ff->eof = 1;
55 if(ff->fd != -1) close(ff->fd);
61 void fastfile_close(fastfile *ff) {
62 if(ff->fd != -1) close(ff->fd);
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");
70 memmove(ff->buffer, &ff->buffer[ff->cursor], ff->size - ff->cursor + 1);
71 ff->size -= ff->cursor;
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);
78 ff->buffer[r + 1] = '\0';
80 // fprintf(stderr, "Read %ld bytes\n", r);
83 if(!r || r < remaining) {
84 // fprintf(stderr, "Read EOF\n");
89 //fprintf(stderr, "Line starts at %ld\n", ff->cursor);
90 if(ff->cursor >= ff->size) return NULL;
92 char *start = &ff->buffer[ff->cursor];
95 while(*s != '\n' && *s != '\0') s++;
97 ff->cursor += ( s - start + 1 );
98 //fprintf(stderr, "Line ends at %ld\n", ff->cursor);
103 const char *filenames[] = {
108 // "/proc/net/stat/nf_conntrack",
109 // "/proc/net/ip_vs_stats",
113 "/proc/self/mountstats",
114 // "/var/log/messages",
118 int main(int argc, char **argv)
124 for(i = 0; i < 400000 ;i++, k++) {
125 if(filenames[k] == NULL) k = 0;
127 //fprintf(stderr, "\nOpening file '%s'\n", filenames[k]);
128 ff = fastfile_open(filenames[k]);
130 fprintf(stderr, "Cannot open file '%s', reason: %s\n", filenames[k], strerror(errno));
134 while((s = fastfile_getline(ff))) ;
135 // fprintf(stderr, "%s\n", s);