This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Vim responds too slow on the latest snapshot of cygwin1.dll


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>
#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;
}

--
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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]