#include #include #include #include #include /* Cycle between a bunch of different messages, to avoid performance * variations due to memory effects of a particular allocation pattern. */ #ifndef NUM_MESSAGES #define NUM_MESSAGES 32 #endif static bool initialize(); static void cleanup(); static size_t run(int i); int main (int argc, char *argv[]) { (void)argc; /* Change cwd to where the binary is. */ char *lastslash = strrchr(argv[0], '/'); char *progname = argv[0]; if(lastslash) { *lastslash = '\0'; if(chdir(argv[0]) < 0) { fprintf(stderr, "Error changing directory to %s.\n", argv[0]); return 1; } *lastslash = '/'; progname = lastslash + 3; /* "/b_" */ } if(!initialize()) { fprintf(stderr, "%s: failed to initialize\n", argv[0]); return 1; } size_t total_bytes = 0; clock_t before = clock(); for(int i = 0; true; i++) { if((i & 0xFF) == 0 && (clock() - before > CLOCKS_PER_SEC)) break; size_t bytes = run(i); if(bytes == 0) { fprintf(stderr, "%s: failed.\n", argv[0]); return 2; } total_bytes += bytes; } double elapsed = ((double)clock() - before) / CLOCKS_PER_SEC; printf("%s:%d\n", progname, (int)(total_bytes / elapsed / (1 << 20))); cleanup(); return 0; }