Created
January 18, 2020 13:13
-
-
Save NilsIrl/6275ce1e862a7835e6632e9e561070ba to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <fcntl.h> | |
#include <stdarg.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <time.h> | |
#include <unistd.h> | |
void fdprintf(int fd, const char *fmt, ...) | |
{ | |
/* Guess we need no more than 100 bytes. */ | |
int n, size = 100; | |
char *p, *np; | |
va_list ap; | |
if (fd < 0) | |
return; | |
if ((p = (char *)malloc(size)) == NULL) | |
return; | |
while (1) | |
{ | |
/* Try to print in the allocated space. */ | |
va_start(ap, fmt); | |
n = vsnprintf(p, size, fmt, ap); | |
va_end(ap); | |
/* If that worked, return the string. */ | |
if (n > -1 && n < size) | |
{ | |
write(fd, p, n); | |
free(p); | |
return; | |
} | |
/* Else try again with more space. */ | |
if (n > -1) /* glibc 2.1 */ | |
size = n + 1; /* precisely what is needed */ | |
else /* glibc 2.0 */ | |
size *= 2; /* twice the old size */ | |
if ((np = (char *)realloc(p, size)) == NULL) | |
{ | |
free(p); | |
return; | |
} | |
else | |
{ | |
p = np; | |
} | |
} | |
} | |
int new_fdprintf(int fd, const char *fmt, ...) | |
{ | |
FILE *file; | |
if ((file = fdopen(dup(fd), "w")) == NULL) | |
{ | |
return -1; | |
} | |
va_list ap; | |
va_start(ap, fmt); | |
int ret = vfprintf(file, fmt, ap); | |
fclose(file); | |
va_end(ap); | |
return ret; | |
} | |
int main(int argc, char *argv[]) | |
{ | |
int age = atoi(argv[2]); | |
int fd = open(argv[3], O_WRONLY | O_CREAT); | |
if (fd == -1) | |
exit(-1); | |
clock_t start_time = clock(); | |
if (start_time == -1) | |
exit(-1); | |
for (int i = 0; i < 1000; ++i) | |
{ | |
new_fdprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age); | |
} | |
clock_t end_time = clock(); | |
if (end_time == -1) | |
exit(-1); | |
printf("new_fdprintf: %d\n", end_time - start_time); | |
start_time = clock(); | |
if (start_time == -1) | |
exit(-1); | |
for (int i = 0; i < 1000; ++i) | |
{ | |
fdprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age); | |
} | |
end_time = clock(); | |
if (end_time == -1) | |
exit(-1); | |
printf("old_fdprintf: %d\n", end_time - start_time); | |
start_time = clock(); | |
if (start_time == -1) | |
exit(-1); | |
for (int i = 0; i < 1000; ++i) | |
{ | |
dprintf(fd, "hi %s how are you?\n did you know your are %d year old?????aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", argv[1], age); | |
} | |
end_time = clock(); | |
if (end_time == -1) | |
exit(-1); | |
printf("dprintf: %d\n", end_time - start_time); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment