From 8b9a3d7195771772292f0fdfacd504b76deb1bf2 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 3 Nov 2009 12:06:31 +0000 Subject: [PATCH] [7.2.269] Many people struggle to find out why Vim startup is slow. Problem: Many people struggle to find out why Vim startup is slow. Solution: Add the --startuptime command line flag. Patch 7.2.269 --- runtime/doc/starting.txt | 8 +++++++ src/feature.h | 10 +++++--- src/globals.h | 4 ++++ src/macros.h | 2 +- src/main.c | 62 ++++++++++++++++++++++++++++++++---------------- src/version.c | 2 ++ 6 files changed, 64 insertions(+), 24 deletions(-) diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt index 2326985b..c1ed1b80 100644 --- a/runtime/doc/starting.txt +++ b/runtime/doc/starting.txt @@ -144,6 +144,13 @@ a slash. Thus "-R" means recovery and "-/R" readonly. -u NORC no yes --noplugin yes no +--startuptime={fname} *--startuptime* + During startup write timing messages to the file {fname}. + This can be used to find out where time is spent while loading + your .vimrc and plugins. + When {fname} already exists new messages are appended. + {only when compiled with this feature} + *--literal* --literal Take file names literally, don't expand wildcards. Not needed for Unix, because Vim always takes file names literally (the @@ -471,6 +478,7 @@ a slash. Thus "-R" means recovery and "-/R" readonly. window title and copy/paste using the X clipboard. This avoids a long startup time when running Vim in a terminal emulator and the connection to the X server is slow. + See |--startuptime| to find out if affects you. Only makes a difference on Unix or VMS, when compiled with the |+X11| feature. Otherwise it's ignored. To disable the connection only for specific terminals, see the diff --git a/src/feature.h b/src/feature.h index ae167503..ea2e5887 100644 --- a/src/feature.h +++ b/src/feature.h @@ -844,10 +844,14 @@ /* #define DEBUG */ /* - * STARTUPTIME Time the startup process. Writes a "vimstartup" file - * with timestamps. + * STARTUPTIME Time the startup process. Writes a file with + * timestamps. */ -/* #define STARTUPTIME "vimstartup" */ +#if defined(FEAT_NORMAL) \ + && ((defined(HAVE_GETTIMEOFDAY) && defined(HAVE_SYS_TIME_H)) \ + || defined(WIN3264)) +# define STARTUPTIME 1 +#endif /* * MEM_PROFILE Debugging of memory allocation and freeing. diff --git a/src/globals.h b/src/globals.h index 2ff31740..bfe48caf 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1567,6 +1567,10 @@ EXTERN int xsmp_icefd INIT(= -1); /* The actual connection */ /* For undo we need to know the lowest time possible. */ EXTERN time_t starttime; +#ifdef STARTUPTIME +EXTERN FILE *time_fd INIT(= NULL); /* where to write startup timing */ +#endif + /* * Some compilers warn for not using a return value, but in some situations we * can't do anything useful with the value. Assign to this variable to avoid diff --git a/src/macros.h b/src/macros.h index 68ea6bcf..51e4dd42 100644 --- a/src/macros.h +++ b/src/macros.h @@ -243,7 +243,7 @@ #endif #ifdef STARTUPTIME -# define TIME_MSG(s) time_msg(s, NULL) +# define TIME_MSG(s) { if (time_fd != NULL) time_msg(s, NULL); } #else # define TIME_MSG(s) #endif diff --git a/src/main.c b/src/main.c index 84aa146e..5bb81a60 100644 --- a/src/main.c +++ b/src/main.c @@ -130,10 +130,6 @@ static char_u *serverMakeName __ARGS((char_u *arg, char *cmd)); #endif -#ifdef STARTUPTIME -static FILE *time_fd = NULL; -#endif - /* * Different types of error messages. */ @@ -173,6 +169,9 @@ main char_u *fname = NULL; /* file name from command line */ mparm_T params; /* various parameters passed between * main() and other functions. */ +#ifdef STARTUPTIME + int i; +#endif /* * Do any system-specific initialisations. These can NOT use IObuff or @@ -203,8 +202,15 @@ main #endif #ifdef STARTUPTIME - time_fd = mch_fopen(STARTUPTIME, "a"); - TIME_MSG("--- VIM STARTING ---"); + for (i = 1; i < argc; ++i) + { + if (STRNICMP(argv[i], "--startuptime=", 14) == 0) + { + time_fd = mch_fopen(argv[i] + 14, "a"); + TIME_MSG("--- VIM STARTING ---"); + break; + } + } #endif starttime = time(NULL); @@ -1150,6 +1156,18 @@ main_loop(cmdwin, noexmode) cursor_on(); do_redraw = FALSE; + +#ifdef STARTUPTIME + /* Now that we have drawn the first screen all the startup stuff + * has been done, close any file for startup messages. */ + if (time_fd != NULL) + { + TIME_MSG("first screen update"); + TIME_MSG("--- VIM STARTED ---"); + fclose(time_fd); + time_fd = NULL; + } +#endif } #ifdef FEAT_GUI if (need_mouse_correct) @@ -1743,6 +1761,10 @@ command_line_scan(parmp) /* already processed, skip */ } #endif + else if (STRNICMP(argv[0] + argv_idx, "startuptime", 11) == 0) + { + /* already processed, skip */ + } else { if (argv[0][argv_idx]) @@ -3211,6 +3233,20 @@ static void time_diff __ARGS((struct timeval *then, struct timeval *now)); static struct timeval prev_timeval; +# ifdef WIN3264 +/* + * Windows doesn't have gettimeofday(), although it does have struct timeval. + */ + static int +gettimeofday(struct timeval *tv, char *dummy) +{ + long t = clock(); + tv->tv_sec = t / CLOCKS_PER_SEC; + tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC; + return 0; +} +# endif + /* * Save the previous time before doing something that could nest. * set "*tv_rel" to the time elapsed so far. @@ -3299,20 +3335,6 @@ time_msg(msg, tv_start) } } -# ifdef WIN3264 -/* - * Windows doesn't have gettimeofday(), although it does have struct timeval. - */ - int -gettimeofday(struct timeval *tv, char *dummy) -{ - long t = clock(); - tv->tv_sec = t / CLOCKS_PER_SEC; - tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC; - return 0; -} -# endif - #endif #if defined(FEAT_CLIENTSERVER) || defined(PROTO) diff --git a/src/version.c b/src/version.c index 92305710..73d2300d 100644 --- a/src/version.c +++ b/src/version.c @@ -677,6 +677,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 269, +/**/ 268, /**/ 267, -- 2.11.4.GIT