Serenity Operating System
at master 105 lines 2.3 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/DeprecatedString.h> 8#include <AK/Optional.h> 9#include <LibCore/ElapsedTimer.h> 10#include <LibMain/Main.h> 11#include <unistd.h> 12 13static void usage() 14{ 15 warnln("usage: allocate [number [unit (B/KiB/MiB)]]"); 16 exit(1); 17} 18 19enum class Unit { 20 Bytes, 21 KiB, 22 MiB, 23}; 24 25ErrorOr<int> serenity_main(Main::Arguments arguments) 26{ 27 int count = 50; 28 auto unit = Unit::MiB; 29 30 if (arguments.argc >= 2) { 31 auto number = arguments.strings[1].to_uint(); 32 if (!number.has_value()) { 33 usage(); 34 } 35 count = number.value(); 36 } 37 38 if (arguments.argc >= 3) { 39 if (arguments.strings[2] == "B") 40 unit = Unit::Bytes; 41 else if (arguments.strings[2] == "KiB") 42 unit = Unit::KiB; 43 else if (arguments.strings[2] == "MiB") 44 unit = Unit::MiB; 45 else 46 usage(); 47 } 48 49 switch (unit) { 50 case Unit::Bytes: 51 break; 52 case Unit::KiB: 53 count *= KiB; 54 break; 55 case Unit::MiB: 56 count *= MiB; 57 break; 58 } 59 60 outln("allocating memory ({} bytes)...", count); 61 auto timer = Core::ElapsedTimer::start_new(); 62 char* ptr = (char*)malloc(count); 63 if (!ptr) { 64 outln("failed."); 65 return 1; 66 } 67 outln("done in {}ms", timer.elapsed()); 68 69 auto pages = count / PAGE_SIZE; 70 auto step = pages / 10; 71 72 outln("writing one byte to each page of allocated memory..."); 73 timer.start(); 74 auto timer2 = Core::ElapsedTimer::start_new(); 75 for (int i = 0; i < pages; ++i) { 76 ptr[i * PAGE_SIZE] = 1; 77 78 if (i != 0 && (i % step) == 0) { 79 auto ms = timer2.elapsed(); 80 if (ms == 0) 81 ms = 1; 82 83 auto bps = double(step * PAGE_SIZE) / (double(ms) / 1000); 84 85 outln("step took {}ms ({}MiB/s)", ms, bps / MiB); 86 87 timer2.start(); 88 } 89 } 90 outln("done in {}ms", timer.elapsed()); 91 92 outln("sleeping for ten seconds..."); 93 for (int i = 0; i < 10; i++) { 94 outln("{}", i); 95 sleep(1); 96 } 97 outln("done."); 98 99 outln("freeing memory..."); 100 timer.start(); 101 free(ptr); 102 outln("done in {}ms", timer.elapsed()); 103 104 return 0; 105}