Skip to content

Instantly share code, notes, and snippets.

@croepha
Last active October 2, 2017 15:33
Show Gist options
  • Save croepha/3a19cdd833056cd013fcb4e83bb58a25 to your computer and use it in GitHub Desktop.
Save croepha/3a19cdd833056cd013fcb4e83bb58a25 to your computer and use it in GitHub Desktop.
compile_time_tests.cpp
/* build.sh:
mkdir -p build/
time clang++ --std=gnu++11 \
-fsanitize=address -fsanitize=undefined \
main.cpp -o build/main.bin
build/main.bin
echo building build/output.c
wc build/output.c
echo gcc
env time gcc -c build/output.c -o build/output.c.o
env time gcc -c build/output.c -o build/output.c.o
env time gcc -c build/output.c -o build/output.c.o
env time gcc -c build/output.c -o build/output.c.o
echo clang
env time clang -c build/output.c -o build/output.c.o
env time clang -c build/output.c -o build/output.c.o
env time clang -c build/output.c -o build/output.c.o
env time clang -c build/output.c -o build/output.c.o
env echo building build/output.cpp
wc build/output.cpp
echo g++
env time g++ -c build/output.cpp -o build/output.cpp.o
env time g++ -c build/output.cpp -o build/output.cpp.o
env time g++ -c build/output.cpp -o build/output.cpp.o
env time g++ -c build/output.cpp -o build/output.cpp.o
echo clang++
env time clang++ -c build/output.cpp -o build/output.cpp.o
env time clang++ -c build/output.cpp -o build/output.cpp.o
env time clang++ -c build/output.cpp -o build/output.cpp.o
env time clang++ -c build/output.cpp -o build/output.cpp.o
building build/output.c
54492 124503 1704453 build/output.c
gcc
2.94user 0.92system 0:03.98elapsed 96%CPU (0avgtext+0avgdata 183624maxresident)k
3368inputs+8424outputs (0major+61886minor)pagefaults 0swaps
2.92user 0.19system 0:03.27elapsed 95%CPU (0avgtext+0avgdata 183480maxresident)k
3368inputs+8424outputs (0major+61876minor)pagefaults 0swaps
3.24user 0.19system 0:03.90elapsed 88%CPU (0avgtext+0avgdata 183384maxresident)k
3368inputs+8424outputs (0major+61875minor)pagefaults 0swaps
2.68user 0.21system 0:03.04elapsed 95%CPU (0avgtext+0avgdata 183472maxresident)k
3368inputs+8424outputs (0major+61877minor)pagefaults 0swaps
clang
1.45user 0.07system 0:01.69elapsed 90%CPU (0avgtext+0avgdata 97296maxresident)k
3336inputs+0outputs (1major+19083minor)pagefaults 0swaps
1.33user 0.06system 0:01.53elapsed 90%CPU (0avgtext+0avgdata 97140maxresident)k
3336inputs+0outputs (1major+19043minor)pagefaults 0swaps
1.38user 0.07system 0:01.65elapsed 88%CPU (0avgtext+0avgdata 97212maxresident)k
3336inputs+0outputs (1major+19069minor)pagefaults 0swaps
1.48user 0.08system 0:01.86elapsed 83%CPU (0avgtext+0avgdata 97144maxresident)k
3336inputs+0outputs (1major+19089minor)pagefaults 0swaps
building build/output.cpp
54492 120319 1059772 build/output.cpp
g++
2.97user 0.25system 0:03.36elapsed 95%CPU (0avgtext+0avgdata 222260maxresident)k
2104inputs+9464outputs (0major+77181minor)pagefaults 0swaps
3.02user 0.17system 0:03.41elapsed 93%CPU (0avgtext+0avgdata 223088maxresident)k
2104inputs+9464outputs (0major+76919minor)pagefaults 0swaps
2.98user 0.14system 0:03.32elapsed 93%CPU (0avgtext+0avgdata 223532maxresident)k
2104inputs+9464outputs (0major+76995minor)pagefaults 0swaps
2.97user 0.19system 0:03.31elapsed 95%CPU (0avgtext+0avgdata 222020maxresident)k
2104inputs+9464outputs (0major+77155minor)pagefaults 0swaps
clang++
1.39user 0.09system 0:01.67elapsed 89%CPU (0avgtext+0avgdata 95416maxresident)k
2072inputs+0outputs (1major+18484minor)pagefaults 0swaps
1.47user 0.08system 0:01.69elapsed 91%CPU (0avgtext+0avgdata 95192maxresident)k
2072inputs+0outputs (1major+18485minor)pagefaults 0swaps
1.48user 0.05system 0:01.69elapsed 90%CPU (0avgtext+0avgdata 95192maxresident)k
2072inputs+0outputs (1major+18492minor)pagefaults 0swaps
1.43user 0.09system 0:01.69elapsed 90%CPU (0avgtext+0avgdata 95536maxresident)k
2072inputs+0outputs (1major+18496minor)pagefaults 0swaps
exited with code 0
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <assert.h>
void build_c() {
srand(1506883738);
auto f = fopen("build/output.c", "w");
assert(f);
int funkyno = 0;
int typeno = 0;
while (funkyno < 10000) {
bool has_constructor = rand()%2;
bool has_destructor = rand()%2;
auto type_member_count = rand()%16 + 1;
auto method_count = rand()%16 + 1;
fprintf(f, "typedef struct Type_%06d {\n", typeno);
for (int i=0;i<type_member_count; i++) {
fprintf(f, " int member_%02d;\n", i);
}
fprintf(f, "} Type_%06d;\n", typeno);
if (has_constructor) {
fprintf(f, "void Type_%06d_constructor(Type_%06d*instance);\n", typeno, typeno);
}
if (has_destructor) {
fprintf(f, "void Type_%06d_destructor(Type_%06d*instance);\n", typeno, typeno);
}
for (int i=0;i<method_count; i++) {
fprintf(f, "void Type_%06d_method_%06d(Type_%06d*instance);\n", typeno, i, typeno);
}
if (has_constructor) {
fprintf(f, "void Type_%06d_constructor(Type_%06d*instance) {\n", typeno, typeno);
for (int i=0;i<type_member_count; i++) {
if (rand()%2) fprintf(f, " instance->member_%02d = %d;\n", i, rand()%8192);
}
fprintf(f, "}\n");
funkyno++;
}
if (has_destructor) {
fprintf(f, "void Type_%06d_destructor(Type_%06d*instance) {\n", typeno, typeno);
for (int i=0;i<type_member_count; i++) {
if (rand()%2) fprintf(f, " instance->member_%02d = %d;\n", i, rand()%8192);
}
fprintf(f, "}\n");
funkyno++;
}
for (int i=0;i<method_count; i++) {
fprintf(f, "void Type_%06d_method_%06d(Type_%06d*instance) {\n", typeno, i, typeno);
fprintf(f, " instance->member_%02d = %d;\n", rand()%type_member_count, rand()%8192);
fprintf(f, "}\n");
funkyno++;
}
typeno++;
fprintf(f, "");
}
fclose(f);
}
void build_cpp() {
srand(1506883738);
auto f = fopen("build/output.cpp", "w");
assert(f);
int funkyno = 0;
int typeno = 0;
while (funkyno < 10000) {
bool has_constructor = rand()%2;
bool has_destructor = rand()%2;
auto type_member_count = rand()%16 + 1;
auto method_count = rand()%16 + 1;
fprintf(f, "struct Type_%06d {\n", typeno);
for (int i=0;i<type_member_count; i++) {
fprintf(f, " int member_%02d;\n", i);
}
if (has_constructor) {
fprintf(f, " Type_%06d();\n", typeno);
funkyno++;
}
if (has_destructor) {
fprintf(f, " ~Type_%06d();\n", typeno);
funkyno++;
}
for (int i=0;i<method_count; i++) {
fprintf(f, " void method_%06d(); \n", i);
funkyno++;
}
fprintf(f, "};\n");
if (has_constructor) {
fprintf(f, "Type_%06d::Type_%06d() {\n", typeno, typeno);
for (int i=0;i<type_member_count; i++) {
if (rand()%2) fprintf(f, " member_%02d = %d;\n", i, rand()%8192);
}
fprintf(f, "}\n");
}
if (has_destructor) {
fprintf(f, "Type_%06d::~Type_%06d() {\n", typeno, typeno);
for (int i=0;i<type_member_count; i++) {
if (rand()%2) fprintf(f, " member_%02d = %d;\n", i, rand()%8192);
}
fprintf(f, "}\n");
}
for (int i=0;i<method_count; i++) {
fprintf(f, "void Type_%06d::method_%06d() {\n", typeno, i);
fprintf(f, " member_%02d = %d;\n", rand()%type_member_count, rand()%8192);
fprintf(f, "}\n");
}
typeno++;
}
fclose(f);
}
int main() {
build_c();
build_cpp();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment