From: Takashi Yano <takashi.yano@nifty.ne.jp>
To: cygwin@cygwin.com
Subject: Re: Vim responds too slow on the latest snapshot of cygwin1.dll
Date: Tue, 07 Jun 2016 12:38:00 -0000 [thread overview]
Message-ID: <20160607213741.4c3fb3486b5f6d70a047bbf3@nifty.ne.jp> (raw)
In-Reply-To: <20160606145242.GB4919@calimero.vinschen.de>
[-- Attachment #1: Type: text/plain, Size: 1398 bytes --]
Hi Corinna,
I have tested the latest (2016-06-06) snapshot. No problem is found.
I evaluated the response of vim in several environments using a test
case attached. This test case measures the time for
(open a file + scroll up/down 100 times + quit)
in vim.
Results are as follows.
The latest snapshot is the fastest! It's 13% faster than 2.5.1.
You did it!
Machine1: Windows 7 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 1.035133 second
snapshot (2016-05-31): 58.479826 second
snapshot (2016-06-06): 0.898675 second
Machine1: Windows 7 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 1.242907 second
snapshot (2016-05-31): 57.491763 second
snapshot (2016-06-06): 0.911885 second
Machine2: Windows 7 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 0.688432 second
snapshot (2016-05-31): 462.305977 second
snapshot (2016-06-06): 0.596733 second
Machine2: Windows 7 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 0.761117 second
snapshot (2016-05-31): 462.280320 second
snapshot (2016-06-06): 0.660631 second
Machine2: Windows 10 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 0.676545 second
snapshot (2016-05-31): 0.599878 second
snapshot (2016-06-06): 0.599495 second
Machine2: Windows 10 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 0.784049 second
snapshot (2016-05-31): 0.675585 second
snapshot (2016-06-06): 0.675050 second
--
Takashi Yano <takashi.yano@nifty.ne.jp>
[-- Attachment #2: pty_vim.c --]
[-- Type: text/x-csrc, Size: 3366 bytes --]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>
int master;
void winsize_set(void)
{
struct winsize win;
ioctl(fileno(stdin), TIOCGWINSZ, &win);
ioctl(master, TIOCSWINSZ, &win);
}
void sig_handler(int sig)
{
switch (sig) {
case SIGWINCH:
winsize_set();
break;
case SIGCHLD:
{
struct termios tt;
tcgetattr(fileno(stdout), &tt);
tt.c_oflag |= OPOST;
tt.c_lflag |= ECHO|ICANON|ISIG;
tt.c_iflag |= IXON;
tcsetattr(fileno(stdout), TCSANOW, &tt);
}
/*
printf("Child Terminated.\n");
*/
break;
}
}
int write_all(int fd, char *buf, int len)
{
int cnt = 0;
char *p = buf;
while (len > cnt) {
int ret = write(fd, p+cnt, len-cnt);
if (ret < 0) return ret;
cnt += ret;
}
return cnt;
}
int automate_vim()
{
int pm, ps;
pid_t pid;
if (openpty(&pm, &ps, NULL, NULL, NULL) < 0) {
perror("openpty()");
exit(-1);
}
master = pm; /* for signal handler */
{ /* Disable echo */
struct termios tt;
tcgetattr(ps, &tt);
tt.c_lflag &= ~ECHO;
tcsetattr(ps, TCSANOW, &tt);
}
pid = fork();
if (pid<0) {
perror("fork()");
close(pm);
exit(-1);
}
if (pid != 0) { /* Parent */
close(ps);
{ /* Setup STDIN and STDOUT */
struct termios tt;
tcgetattr(fileno(stdout), &tt);
tt.c_oflag &= ~OPOST;
tcsetattr(fileno(stdout), TCSANOW, &tt);
tcgetattr(fileno(stdin), &tt);
tt.c_lflag &= ~(ECHO|ICANON|ISIG);
tt.c_iflag &= ~IXON;
tcsetattr(fileno(stdin), TCSANOW, &tt);
}
signal(SIGWINCH, sig_handler);
signal(SIGCHLD, sig_handler);
winsize_set();
{ /* Send commands to vim */
int i;
write(pm, "1G", 2); /* Goto first line */
for (i=0; i<100; i++) {
write(pm, "\006\002", 2); /* Scroll up and down */
}
write(pm, ":q!\n", 4); /* Quit */
}
/* Process Input and Output */
for (;;) {
fd_set rdfds;
int nfd;
int r;
FD_ZERO(&rdfds);
FD_SET(pm, &rdfds);
FD_SET(fileno(stdin), &rdfds);
nfd = ((pm > fileno(stdin))? pm : fileno(stdin) ) + 1;
r = select(nfd, &rdfds, NULL, NULL, NULL);
if (r<0 && errno == EINTR) {
/*
if ( waitpid(pid, NULL, WNOHANG) == pid) break;
*/
continue;
}
if (r<=0) {
perror("select()");
close(pm);
exit(-1);
}
if (r) {
char buf[BUFSIZ];
int len;
if (FD_ISSET(pm, &rdfds)) {
len = read(pm, buf, BUFSIZ);
if (len<=0) break;
if (len > 0) {
len = write_all(fileno(stdout), buf, len);
if (len<=0) break;
}
}
if (FD_ISSET(fileno(stdin), &rdfds)) {
len = read(fileno(stdin), buf, BUFSIZ);
if (len<=0) break;
len = write_all(pm, buf, len);
if (len<=0) break;
}
}
}
wait(NULL);
close(pm);
} else { /* Child */
close(pm);
setsid();
ioctl(ps, TIOCSCTTY, 0);
dup2(ps, fileno(stdin));
dup2(ps, fileno(stdout));
dup2(ps, fileno(stderr));
close(ps);
execl("/usr/bin/vim", "vim", "pty_vim.c", NULL);
perror("execl()");
exit(-1);
}
return 0;
}
int main()
{
struct timespec tv0, tv1;
clock_gettime(CLOCK_MONOTONIC, &tv0);
automate_vim();
clock_gettime(CLOCK_MONOTONIC, &tv1);
printf("Total: %f second\n",
(tv1.tv_sec - tv0.tv_sec) + (tv1.tv_nsec - tv0.tv_nsec)*1e-9);
return 0;
}
[-- Attachment #3: Type: text/plain, Size: 218 bytes --]
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
next prev parent reply other threads:[~2016-06-07 12:38 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-05 15:33 Takashi Yano
2016-06-06 8:43 ` Corinna Vinschen
2016-06-06 11:06 ` Takashi Yano
2016-06-06 13:50 ` Chris Sutcliffe
2016-06-06 14:52 ` Corinna Vinschen
2016-06-06 16:15 ` Chris Sutcliffe
2016-06-07 12:38 ` Takashi Yano [this message]
2016-06-07 13:12 ` Corinna Vinschen
2016-06-08 1:21 ` John Hood
2016-06-08 9:00 ` Corinna Vinschen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160607213741.4c3fb3486b5f6d70a047bbf3@nifty.ne.jp \
--to=takashi.yano@nifty.ne.jp \
--cc=cygwin@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).