From 8863ecde5dba262c0736da7505a9fa3655ed42f6 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Thu, 2 Jul 2009 16:02:32 +0100 Subject: [PATCH] Add the guestfish 'time' command. > time sfdisk /dev/sda 0 0 0 , elapsed time: 6.12 seconds --- fish/Makefile.am | 3 ++- fish/fish.c | 10 ++++++++++ fish/fish.h | 20 ++++++++++++-------- fish/time.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ guestfish.pod | 7 +++++++ 5 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 fish/time.c diff --git a/fish/Makefile.am b/fish/Makefile.am index 34b1a0b..03e872c 100644 --- a/fish/Makefile.am +++ b/fish/Makefile.am @@ -28,7 +28,8 @@ guestfish_SOURCES = \ fish.h \ glob.c \ lcd.c \ - more.c + more.c \ + time.c guestfish_CFLAGS = \ -I$(top_builddir)/src -Wall \ diff --git a/fish/fish.c b/fish/fish.c index 90740d5..59348c3 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -727,6 +727,8 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd) else if (strcasecmp (cmd, "more") == 0 || strcasecmp (cmd, "less") == 0) r = do_more (cmd, argc, argv); + else if (strcasecmp (cmd, "time") == 0) + r = do_time (cmd, argc, argv); else r = run_action (cmd, argc, argv); @@ -760,6 +762,8 @@ list_builtin_commands (void) "lcd", _("local change directory")); printf ("%-20s %s\n", "glob", _("expand wildcards in command")); + printf ("%-20s %s\n", + "time", _("measure time taken to run command")); /* actions are printed after this (see list_commands) */ } @@ -845,6 +849,12 @@ display_builtin_command (const char *cmd) strcasecmp (cmd, "q") == 0) printf (_("quit - quit guestfish\n" " quit\n")); + else if (strcasecmp (cmd, "time") == 0) + printf (_("time - measure time taken to run command\n" + " time [ ...]\n" + "\n" + " This runs as usual, and prints the elapsed\n" + " time afterwards.\n")); else fprintf (stderr, _("%s: command not known, use -h to list all commands\n"), cmd); diff --git a/fish/fish.h b/fish/fish.h index ac84647..cad8073 100644 --- a/fish/fish.h +++ b/fish/fish.h @@ -77,17 +77,21 @@ extern int do_glob (const char *cmd, int argc, char *argv[]); /* in more.c */ extern int do_more (const char *cmd, int argc, char *argv[]); +/* in time.c */ +extern int do_time (const char *cmd, int argc, char *argv[]); + /* This should just list all the built-in commands so they can * be added to the generated auto-completion code. */ #define BUILTIN_COMMANDS_FOR_COMPLETION \ - "help", \ - "quit", "exit", "q", \ - "alloc", "allocate", \ - "echo", \ - "edit", "vi", "emacs", \ - "lcd", \ - "glob", \ - "more", "less" + "help", \ + "quit", "exit", "q", \ + "alloc", "allocate", \ + "echo", \ + "edit", "vi", "emacs", \ + "lcd", \ + "glob", \ + "more", "less", \ + "time" #endif /* FISH_H */ diff --git a/fish/time.c b/fish/time.c new file mode 100644 index 0000000..d2a2066 --- /dev/null +++ b/fish/time.c @@ -0,0 +1,54 @@ +/* guestfish - the filesystem interactive shell + * Copyright (C) 2009 Red Hat Inc. + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include + +#include +#include +#include +#include + +#include "fish.h" + +int +do_time (const char *cmd, int argc, char *argv[]) +{ + struct timeval start_t, end_t; + int64_t start_us, end_us, elapsed_us; + + if (argc < 1) { + fprintf (stderr, _("use 'time command [args...]'\n")); + return -1; + } + + gettimeofday (&start_t, NULL); + + if (issue_command (argv[0], &argv[1], NULL) == -1) + return -1; + + gettimeofday (&end_t, NULL); + + start_us = (int64_t) start_t.tv_sec * 1000000 + start_t.tv_usec; + end_us = (int64_t) end_t.tv_sec * 1000000 + end_t.tv_usec; + elapsed_us = end_us - start_us; + printf ("elapsed time: %d.%02d seconds\n", + (int) (elapsed_us / 1000000), + (int) ((elapsed_us / 10000) % 100)); + + return 0; +} diff --git a/guestfish.pod b/guestfish.pod index 07c7cd0..0c3fda6 100644 --- a/guestfish.pod +++ b/guestfish.pod @@ -419,6 +419,13 @@ NOTE: This will not work reliably for large files This exits guestfish. You can also use C<^D> key. +=head2 time + + time command args... + +Run the command as usual, but print the elapsed time afterwards. This +can be useful for benchmarking operations. + =head1 COMMANDS @ACTIONS@ -- 1.8.3.1