Skip to content

Instantly share code, notes, and snippets.

@Justasic
Last active September 20, 2018 06:16
Show Gist options
  • Save Justasic/4a48103131aeb93d9595b8b9533f3972 to your computer and use it in GitHub Desktop.
Save Justasic/4a48103131aeb93d9595b8b9533f3972 to your computer and use it in GitHub Desktop.
How fast can you write a file in C?
/*
* Written by Justin Crawford
* Compile with: clang -Wall -Wextra -O3 -D_FORTIFY_SOURCE=2 -march=native -o main main.c
*/
#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
size_t kibibyte(size_t x) { return x << 10; }
size_t mebibyte(size_t x) { return kibibyte(x) << 10; }
size_t gibibyte(size_t x) { return mebibyte(x) << 10; }
const char data[] = "Phasellus faucibus massa ornare, dictum velit at, laoreet tellus. Praesent ac auctor libero, id gravida felis. Proin lectus justo, iaculis tristique lectus sed, rhoncus scelerisque est. Praesent volutpat diam non felis porttitor, nec malesuada nisl suscipit. Vestibulum posuere et sapien non ornare. Mauris nec dui nunc. Nullam gravida bibendum pharetra. Sed accumsan id ex varius porttitor. Sed lobortis, augue at sodales pulvinar, lacus mi scelerisque lectus, quis blandit massa sapien ac nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nec felis elit. Proin ornare vitae nisi a semper. Sed elementum nisl in ante mattis, eu tincidunt mauris maximus. Nam scelerisque arcu risus, id commodo erat euismod sed. Ut a dolor placerat, vulputate ipsum a, gravida ligula. Aenean semper laoreet lectus ut egestas. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer at molestie turpis. Aenean mollis felis in urna fermentum, at mollis augue placerat. Sed sed mi metus. Vestibulum bibendum lectus id quam eleifend, eget malesuada lorem vehicula. Maecenas tincidunt ipsum eros, ut vulputate purus egestas at. Fusce lacus libero, feugiat nec luctus non, mattis quis ante. Nulla magna sapien, faucibus a ligula eu, tincidunt maximus mi. In tincidunt dictum ipsum, sit amet fermentum felis varius at. Nunc.\n";
int main(int argc, char **argv)
{
if (argc <= 1)
{
fprintf(stderr, "You must provide an argument for the output file\n");
return EXIT_FAILURE;
}
FILE *f = fopen(argv[1], "w");
if (!f)
{
fprintf(stderr, "Failed to open %s: %s\n", argv[1], strerror(errno));
return EXIT_FAILURE;
}
size_t written = 0, towrite = gibibyte(2);
posix_fallocate(fileno(f), 0, towrite);
printf("Total bytes (nibbles?) to write: %zu\n", towrite);
while(written <= towrite)
written += fwrite(data, 1, sizeof(data), f);
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment