#!/usr/bin/python3 import os, hashlib, time, numpy, sys, datetime name = 'hierarchy' def make_name(i): path = '.' digits = '%d' % i for d in digits: path = path+'/number-'+d return path[2:]+('_%d' % i) allowed_chars = 'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ' def hashid(n): m = hashlib.sha1() m.update(str(n).encode('utf-8')) name = '' for i in m.digest()[:24]: name += allowed_chars[i % len(allowed_chars)] return name+('_%d' % n) def hash_integer(n): m = hashlib.sha1() m.update(str(n).encode('utf-8')) name = 0 for i in m.digest()[:8]: name = name*256 + i return abs(name) def open_and_gitadd(fname): f = open(fname, 'w') assert(not os.system('git add '+fname)) return f def create_bench(N): sconsf = open_and_gitadd('SConstruct') facf = open_and_gitadd('top.fac') open_and_gitadd('Tupfile.ini') sconsf.write(""" env = Environment(CPPPATH=['.']) """) for i in range(N): if i > 9: os.makedirs(os.path.dirname(make_name(i)), exist_ok=True) cname = make_name(i) + '.c' hname = make_name(i) + '.h' includes = '' funcs = '' for xx in [i+ii for ii in range(10)]: nhere = hash_integer(xx) % N includes += '#include "%s.h"\n' % make_name(nhere) funcs += ' %s();\n' % hashid(nhere) facf.write(""" # %d | gcc -I. -O2 -c -o %s.o %s.c > %s.o """ % (i, make_name(i), make_name(i), make_name(i))) sconsf.write(""" env.Object('%s.c') """ % make_name(i)) f = open_and_gitadd(make_name(i)+'.c') f.write('\n') f.write("""/* c file %s */ %s#include "%s" #include #include #include #include #include #include #include void delete_from_%s(list%s **list, const char *path) { while (*list != NULL) { if (strcmp((*list)->path, path) == 0) { list%s *to_be_deleted = *list; *list = (*list)->next; free(to_be_deleted->path); free(to_be_deleted); return; } list = &((*list)->next); } } int is_in_%s(const list%s *ptr, const char *path) { while (ptr != NULL) { if (strcmp(ptr->path, path) == 0) { return 1; } ptr = ptr->next; } return 0; } void insert_to_%s(list%s **list, const char *path) { delete_from_%s(list, path); list%s *newhead = (list%s *)malloc(sizeof(list%s)); newhead->next = *list; newhead->path = malloc(strlen(path)+1); strcpy(newhead->path, path); *list = newhead; } void free_%s(list%s *list) { while (list != NULL) { list%s *d = list; list = list->next; free(d->path); free(d); } } static void stupid_this(char *s) { while (*s) { while (*s < 'a') { *s += 13; } while (*s > 'z') { *s -= 13; } printf("%%c", *s); s++; } printf("\\n"); } void %s() { stupid_this("Hello world %s!\\n"); %s} """ % (cname, includes, hname, hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), funcs)) f.close() f = open_and_gitadd(make_name(i)+'.h') f.write("""/* header %s */ #ifndef %s_H #define %s_H typedef struct list%s { char *path; struct list%s *next; } list%s; void insert_to_%s(list%s **list, const char *path); void delete_from_%s(list%s **list, const char *path); int is_in_%s(const list%s *list, const char *path); void free_%s(list%s *list); void %s(); #endif """ % (hname, hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i), hashid(i))) f.close() return N verbs = ['building', 'touching-all', 'modifying-header', 'modifying-c', 'doing-nothing'] def prepare(): return {'touching-all': r'sleep 1 && find . -name "*.c" -exec touch \{\} \;', 'modifying-header': 'echo >> number-0.h', 'modifying-c': 'echo >> number-0.c'}