summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConrad Pankoff <deoxxa@fknsrs.biz>2019-06-11 21:10:55 +1000
committerAndreas Kling <awesomekling@gmail.com>2019-06-12 15:38:17 +0200
commitf0ce0910abfc29c24edf971f5998df9f8429e3e3 (patch)
treef9ffdfd05b0f3844293ab625b618cc0fa1e91be0
parentf7dce4765c4762d0c9f49f857ef1b73bcac19971 (diff)
downloadserenity-f0ce0910abfc29c24edf971f5998df9f8429e3e3.zip
Userland: Add test program for stressing memory allocation
-rw-r--r--Userland/allocate.cpp98
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;
+}