Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 31 Oct 2000 14:24:15 +0000 (GMT)
From:      George Reid <greid@ukug.uk.freebsd.org>
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/22442: [PATCH] Increase speed of split(1)
Message-ID:  <Pine.BSF.4.21.0010311419040.4159-100000@sobek.nevernet.net>

next in thread | raw e-mail | index | archive | help

>Number:         22442
>Category:       bin
>Synopsis:       [PATCH] Increase speed of split(1)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Tue Oct 31 06:30:01 PST 2000
>Closed-Date:
>Last-Modified:
>Originator:     George Reid
>Release:        FreeBSD 5.0-CURRENT i386
>Organization:
FreeBSD UK User Group
>Environment:
>Description:
The speed of split(1) can be increased by using dynamically-allocated
buffers.

The following results are from a large file created with
dd if=/dev/zero of=bigfile bs=1024k count=300

$ /usr/bin/time split -b 1024k bigfile
       90.19 real         0.02 user        22.42 sys

$ /usr/bin/time ./mysplit -b 1024k bigfile
       81.81 real         0.04 user        25.60 sys

This could represent problems on systems with low memory (perhaps further
modification is needed), but given that the average amount of memory being
distributed with PCs nowadays, this might be useful.

>How-To-Repeat:

>Fix:

--- split.c.orig	Tue Oct 31 14:11:46 2000
+++ split.c	Tue Oct 31 14:16:30 2000
@@ -62,7 +62,7 @@
 long	 numlines;			/* Line count to split on. */
 int	 file_open;			/* If a file open. */
 int	 ifd = -1, ofd = -1;		/* Input/output file descriptors. */
-char	 bfr[MAXBSIZE];			/* I/O buffer. */
+char	 *bfr;				/* I/O buffer. */
 char	 fname[MAXPATHLEN];		/* File name prefix. */
 regex_t	 rgx;
 int	 pflag;
@@ -176,11 +176,16 @@
 	int dist, len;
 	char *C;
 
+	if((bfr = (char *)malloc(bytecnt)) == NULL)
+		err(EX_OSERR, "malloc");
+
 	for (bcnt = 0;;)
-		switch ((len = read(ifd, bfr, MAXBSIZE))) {
+		switch ((len = read(ifd, bfr, bytecnt))) {
 		case 0:
+			free(bfr);
 			exit(0);
 		case -1:
+			free(bfr);
 			err(EX_IOERR, "read");
 			/* NOTREACHED */
 		default:
@@ -195,22 +200,29 @@
 				    len -= bytecnt, C += bytecnt) {
 					newfile();
 					if (write(ofd,
-					    C, (int)bytecnt) != bytecnt)
+					    C, (int)bytecnt) != bytecnt) {
+						free(bfr);
 						err(EX_IOERR, "write");
+					}
 				}
 				if (len != 0) {
 					newfile();
-					if (write(ofd, C, len) != len)
+					if (write(ofd, C, len) != len) {
+						free(bfr);
 						err(EX_IOERR, "write");
+					}
 				} else
 					file_open = 0;
 				bcnt = len;
 			} else {
 				bcnt += len;
-				if (write(ofd, bfr, len) != len)
+				if (write(ofd, bfr, len) != len) {
+					free(bfr);
 					err(EX_IOERR, "write");
+				}
 			}
 		}
+	free(bfr);
 }
 
 /*
@@ -227,6 +239,9 @@
 	if ((infp = fdopen(ifd, "r")) == NULL)
 		err(EX_NOINPUT, "fdopen");
 
+	if((bfr = (char *)malloc(MAXBSIZE)) == NULL)
+		err(EX_OSERR, "malloc");
+
 	/* Process input one line at a time */
 	while (fgets(bfr, sizeof(bfr), infp) != NULL) {
 		const int len = strlen(bfr);
@@ -254,9 +269,13 @@
 			newfile();
 
 		/* Write out line */
-		if (write(ofd, bfr, len) != len)
+		if (write(ofd, bfr, len) != len) {
+			free(bfr);
 			err(EX_IOERR, "write");
+		}
 	}
+
+	free(bfr);
 
 	/* EOF or error? */
 	if (ferror(infp))


>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0010311419040.4159-100000>