Speed up reading sub-process output on MS-Windows

* src/w32proc.c (syms_of_ntproc) <w32-pipe-read-delay>: Set to
zero.  For the details, see this discussion:
http://lists.gnu.org/archive/html/emacs-devel/2018-06/msg00711.html.
* src/w32.c (_sys_read_ahead): Update the commentary for
w32-pipe-read-delay usage.

* doc/emacs/msdos.texi (Windows Processes): Document
w32-pipe-read-delay.

* etc/NEWS: Mention the change of the value of w32-pipe-read-delay.
This commit is contained in:
Eli Zaretskii 2018-06-30 11:43:42 +03:00
parent 3b4e65e797
commit ed65ea1815
4 changed files with 35 additions and 13 deletions

View file

@ -808,6 +808,13 @@ communications with subprocesses to programs that exhibit unusual
behavior with respect to buffering pipe I/O.
@ifnottex
@vindex w32-pipe-read-delay
If you need to invoke MS-DOS programs as Emacs subprocesses, you may
see low rate of reading data from such programs. Setting the variable
@code{w32-pipe-read-delay} to a non-zero value may improve throughput
in these cases; we suggest the value of 50 for such situations. The
default is zero.
@findex w32-shell-execute
The function @code{w32-shell-execute} can be useful for writing
customized commands that run MS-Windows applications registered to

View file

@ -851,6 +851,17 @@ retrieving values stored under a given key. It is intended to be used
for supporting features such as XDG-like location of important files
and directories.
+++
** The default value of 'w32-pipe-read-delay' is now zero.
This speeds up reading output from sub-processes that produce a lot of
data.
This variable may need to be non-zero only when running DOS programs
as Emacs subprocesses, which by now is not supported on modern
versions of MS-Windows. Set this variable to 50 if for some reason
you need the old behavior (and please report such situations to Emacs
developers).
----------------------------------------------------------------------
This file is part of GNU Emacs.

View file

@ -8469,13 +8469,14 @@ _sys_read_ahead (int fd)
{
rc = _read (fd, &cp->chr, sizeof (char));
/* Give subprocess time to buffer some more output for us before
reporting that input is available; we need this because Windows 95
connects DOS programs to pipes by making the pipe appear to be
the normal console stdout - as a result most DOS programs will
write to stdout without buffering, ie. one character at a
time. Even some W32 programs do this - "dir" in a command
shell on NT is very slow if we don't do this. */
/* Optionally give subprocess time to buffer some more output
for us before reporting that input is available; we may need
this because Windows 9X connects DOS programs to pipes by
making the pipe appear to be the normal console stdout -- as
a result most DOS programs will write to stdout without
buffering, i.e., one character at a time. Even some W32
programs do this -- "dir" in a command shell on NT is very
slow if we don't do this. */
if (rc > 0)
{
int wait = w32_pipe_read_delay;

View file

@ -3763,14 +3763,17 @@ them blocking when trying to access unmounted drives etc. */);
DEFVAR_INT ("w32-pipe-read-delay", w32_pipe_read_delay,
doc: /* Forced delay before reading subprocess output.
This is done to improve the buffering of subprocess output, by
avoiding the inefficiency of frequently reading small amounts of data.
This may need to be done to improve the buffering of subprocess output,
by avoiding the inefficiency of frequently reading small amounts of data.
Typically needed only with DOS programs on Windows 9X; set to 50 if
throughput with such programs is slow.
If positive, the value is the number of milliseconds to sleep before
reading the subprocess output. If negative, the magnitude is the number
of time slices to wait (effectively boosting the priority of the child
process temporarily). A value of zero disables waiting entirely. */);
w32_pipe_read_delay = 50;
signaling that output from a subprocess is ready to be read.
If negative, the value is the number of time slices to wait (effectively
boosting the priority of the child process temporarily).
A value of zero disables waiting entirely. */);
w32_pipe_read_delay = 0;
DEFVAR_INT ("w32-pipe-buffer-size", w32_pipe_buffer_size,
doc: /* Size of buffer for pipes created to communicate with subprocesses.