/* testspeed.c - Command to test file read speed */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2012 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GRUB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GRUB. If not, see . */ #include #include #include #include #include #include #include #include GRUB_MOD_LICENSE ("GPLv3+"); #define DEFAULT_BLOCK_SIZE 65536 static const struct grub_arg_option options[] = { {"size", 's', 0, N_("Specify size for each read operation"), 0, ARG_TYPE_INT}, {0, 0, 0, 0, 0, 0} }; static grub_err_t grub_cmd_testspeed (grub_extcmd_context_t ctxt, int argc, char **args) { struct grub_arg_list *state = ctxt->state; grub_uint64_t start; grub_uint64_t end; grub_ssize_t block_size; grub_disk_addr_t total_size; char *buffer; grub_file_t file; grub_uint64_t whole, fraction; if (argc == 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected")); block_size = (state[0].set) ? grub_strtoul (state[0].arg, 0, 0) : DEFAULT_BLOCK_SIZE; if (block_size <= 0) return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("invalid block size")); buffer = grub_malloc (block_size); if (buffer == NULL) return grub_errno; file = grub_file_open (args[0]); if (file == NULL) goto quit; total_size = 0; start = grub_get_time_ms (); while (1) { grub_ssize_t size = grub_file_read (file, buffer, block_size); if (size <= 0) break; total_size += size; } end = grub_get_time_ms (); grub_file_close (file); grub_printf_ (N_("File size: %s\n"), grub_get_human_size (total_size, GRUB_HUMAN_SIZE_NORMAL)); whole = grub_divmod64 (end - start, 1000, &fraction); grub_printf_ (N_("Elapsed time: %llu.%03llu s \n"), (unsigned long long) whole, (unsigned long long) fraction); if (end != start) { grub_uint64_t speed = grub_divmod64 (total_size * 100ULL * 1000ULL, end - start, 0); grub_printf_ (N_("Speed: %s \n"), grub_get_human_size (speed, GRUB_HUMAN_SIZE_SPEED)); } quit: grub_free (buffer); return grub_errno; } static grub_extcmd_t cmd; GRUB_MOD_INIT(testspeed) { cmd = grub_register_extcmd ("testspeed", grub_cmd_testspeed, 0, N_("[-s SIZE] FILENAME"), N_("Test file read speed."), options); } GRUB_MOD_FINI(testspeed) { grub_unregister_extcmd (cmd); }