diff options
author | Conrad Pankoff <deoxxa@fknsrs.biz> | 2019-06-11 21:10:55 +1000 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-06-12 15:38:17 +0200 |
commit | f0ce0910abfc29c24edf971f5998df9f8429e3e3 (patch) | |
tree | f9ffdfd05b0f3844293ab625b618cc0fa1e91be0 | |
parent | f7dce4765c4762d0c9f49f857ef1b73bcac19971 (diff) | |
download | serenity-f0ce0910abfc29c24edf971f5998df9f8429e3e3.zip |
Userland: Add test program for stressing memory allocation
-rw-r--r-- | Userland/allocate.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Userland/allocate.cpp b/Userland/allocate.cpp new file mode 100644 index 0000000000..90f89248aa --- /dev/null +++ b/Userland/allocate.cpp @@ -0,0 +1,98 @@ +#include <AK/AKString.h> +#include <LibCore/CElapsedTimer.h> +#include <stdio.h> +#include <unistd.h> + +void usage(void) +{ + printf("usage: allocate [number [unit (B/KB/MB)]]\n"); + exit(1); +} + +enum Unit { Bytes, KiloBytes, MegaBytes }; + +int main(int argc, char** argv) +{ + unsigned count = 50; + Unit unit = MegaBytes; + + if (argc >= 2) { + bool ok; + count = String(argv[1]).to_uint(ok); + if (!ok) { + usage(); + } + } + + if (argc >= 3) { + if (strcmp(argv[2], "B") == 0) + unit = Bytes; + else if (strcmp(argv[2], "KB") == 0) + unit = KiloBytes; + else if (strcmp(argv[2], "MB") == 0) + unit = MegaBytes; + else + usage(); + } + + switch (unit) { + case Bytes: + break; + case KiloBytes: + count *= 1024; + break; + case MegaBytes: + count *= 1024 * 1024; + break; + } + + CElapsedTimer timer; + + printf("allocating memory (%d bytes)...\n", count); + timer.start(); + char* ptr = (char*)malloc(count); + if (!ptr) { + printf("failed.\n"); + return 1; + } + printf("done in %dms\n", timer.elapsed()); + + auto pages = count / 4096; + auto step = pages / 10; + + CElapsedTimer timer2; + + printf("writing one byte to each page of allocated memory...\n"); + timer.start(); + timer2.start(); + for (int i = 0; i < pages; ++i) { + ptr[i * 4096] = 1; + + if (i != 0 && (i % step) == 0) { + auto ms = timer2.elapsed(); + if (ms == 0) + ms = 1; + + auto bps = double(step * 4096) / (double(ms) / 1000); + + printf("step took %dms (%fMB/s)\n", ms, bps / 1024 / 1024); + + timer2.start(); + } + } + printf("done in %dms\n", timer.elapsed()); + + printf("sleeping for ten seconds...\n"); + for (int i = 0; i < 10; i++) { + printf("%d\n", i); + sleep(1); + } + printf("done.\n"); + + printf("freeing memory...\n"); + timer.start(); + free(ptr); + printf("done in %dms\n", timer.elapsed()); + + return 0; +} |